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) }
Run Code Online (Sandbox Code Playgroud)
结束
我不明白的是这一行:
line.gsub!(/`(.*?)`/) { eval($1) }
Run Code Online (Sandbox Code Playgroud)
line在块的结果的匹配部分内替换.?修改的.*RE以便它匹配不超过必要继续匹配后续的RE元素.这被称为"非贪婪".如果没有?,则.*可能还会匹配第二个反引号,具体取决于行的其余部分,然后整个表达式可能会失败.$1RE 指定的,它指的是RE的第一个paren封闭部分("反向引用").在大图中,所有这些的结果是包含反引号括号表达式的行将反引号(和反引号)中的部分替换为执行包含的Ruby表达式的结果值.并且由于外部块受到a redo,因此循环将立即重复而不重新运行while条件.这意味着得到的表达式也需要进行反引号评估.