01 st = "\033[7m" 02 en = "\033[m" 03 04 while TRUE 05 print "str> " 06 STDOUT.flush 07 str = gets 08 break if not str 09 str.chop! 10 print "pat> " 11 STDOUT.flush 12 re = gets 13 break if not re 14 re.chop! 15 str.gsub! re, "#{st}\\#{en}" 16 print str, "\n" 17 end 18 print "\n"
在行4,while的條件被硬設為 true,因此這好像構(gòu)成了一個無限循環(huán).但我們在行8和行13放置了break語句以跳出循環(huán).這兩個break語句也是 if 修飾辭(if modifier)的一個例子.一個"if修飾辭"當且僅當指明條件滿足時執(zhí)行它左邊的語句.
行15應給予注意.首先,注意gsub!也是一個破壞函數(shù).它通過替換所有符合 re 模式字符來修改 str(sub指替換,首字母 g 指全局, 比如,替換所有的匹配而不只是第一個匹配).到此為止,還好;但我們用什么來替代文本中的匹配部分呢? 在行1和行2里的 st 和 en 被分別定義為表示反轉(zhuǎn)文本顏色(color-inverted)和恢復正常文本顏色的ANSI碼. 在行15,它們被#{}括起以確保他們被前面定義的那樣解釋(這樣我們才沒看見變量名被打印出來).在這中間是 "\\".這是個小把戲.因為替換字符串是由雙引號引起的,一對反斜杠會被解釋為一個單一的反斜杠;所以 gsub!實際上得到的是"\",就一段特殊代碼正好就是表示"任何與模式于第一處匹配的字符".因此新的字符串在被打印出來的時候,很像原來的那個,只不過匹配的部分以反視(inverse video)的方式高亮度顯示出來.