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) }
答案 0 :(得分:5)
line
的匹配部分,即块的结果。?
修改.*
RE,使其匹配不超过继续匹配后续RE元素所必需的内容。这被称为“非贪婪”。如果没有?
,.*
也可能匹配第二个反引号,具体取决于该行的其余部分,然后整个表达式可能会失败。$1
指定,它指的是RE的第一个封闭部分(“反向引用”)。在大图中,所有这些的结果是包含反引号括号表达式的行将反引号(和反引号)中的部分替换为执行包含的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+1
,则eval会将其替换为2.