这个反引红宝石代码是什么意思?

时间:2009-12-07 04:06:39

标签: ruby regex

while line = gets
   next if line =~ /^\s*#/    # skip comments
   break if line =~ /^END/   # stop at end

   #substitute stuff in backticks and try again
   redo if line.gsub!(/`(.*?)`/) { eval($1) } 

我不明白的是这一行:

line.gsub!(/`(.*?)`/) { eval($1) }
  1. gsub是什么!究竟呢?
  2. 正则表达式(。*?)
  3. 的含义
  4. 块{eval($ 1)}
  5. 的含义

3 个答案:

答案 0 :(得分:5)

  1. 它将替换line的匹配部分,即块的结果。
  2. 它将匹配前一个子表达式的0或更多(即'。',匹配任何一个char)。 ?修改.* RE,使其匹配不超过继续匹配后续RE元素所必需的内容。这被称为“非贪婪”。如果没有?.*也可能匹配第二个反引号,具体取决于该行的其余部分,然后整个表达式可能会失败。
  3. 该块返回反向引用的eval结果(“评估Ruby表达式”),后引用是反向刻度字符之间字符串的一部分。这由$1指定,它指的是RE的第一个封闭部分(“反向引用”)。
  4. 在大图中,所有这些的结果是包含反引号括号表达式的行将反引号(和反引号)中的部分替换为执行包含的Ruby表达式的结果值。并且由于外部块受redo的约束,因此循环将立即重复而不重新运行while条件。这意味着得到的表达式也需要进行反引号评估。

答案 1 :(得分:3)

替换line中反引号之间的所有内容,并评估其中包含的ruby代码。

>> line = "one plus two equals `1+2`"
>> line.gsub!(/`(.*?)`/) { eval($1) }
>> p line
=> "one plus two equals 3"

.*匹配零个或多个字符,?使其不贪婪(即,它将采用最短匹配而不是最长匹配)。

$1是匹配()之间的内容的字符串。在上面的示例中,$1将设置为"1+2"eval将字符串计算为ruby代码。

答案 2 :(得分:1)

line.gsub!(/(。*?)/) { eval($1) }

  1. GSUB!替换行(相反,如果使用line = line.gsub)。
  2. 。*?所以它只匹配到第一个`,否则它会替换多个匹配。
  3. 该块执行匹配的任何内容(例如,如果“line”包含1+1,则eval会将其替换为2.