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

Ste*_*ang 2 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) } 
Run Code Online (Sandbox Code Playgroud)

结束

我不明白的是这一行:

line.gsub!(/`(.*?)`/) { eval($1) }
Run Code Online (Sandbox Code Playgroud)
  1. 什么是gsub!到底怎么办?
  2. 正则表达式的含义(.*?)
  3. 块的含义{eval($ 1)}

Dig*_*oss 5

  1. 它将line在块的结果的匹配部分内替换.
  2. 它将匹配前一个子表达式的0或更多(即'.',匹配任何一个char).该?修改的.*RE以便它匹配不超过必要继续匹配后续的RE元素.这被称为"非贪婪".如果没有?,则.*可能还会匹配第二个反引号,具体取决于行的其余部分,然后整个表达式可能会失败.
  3. 该块返回反向引用的eval结果("评估Ruby表达式"),后引用是反向刻度字符之间字符串的一部分.这是由$1RE 指定的,它指的是RE的第一个paren封闭部分("反向引用").

在大图中,所有这些的结果是包含反引号括号表达式的行将反引号(和反引号)中的部分替换为执行包含的Ruby表达式的结果值.并且由于外部块受到a redo,因此循环将立即重复而不重新运行while条件.这意味着得到的表达式也需要进行反引号评估.