[英]what does this backtick ruby code mean?
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) }
line
的匹配部分內替換,即塊的結果。 ?
修改.*
RE,使其匹配不超過繼續匹配后續RE元素所必需的。 這被稱為“非貪婪”。 沒有?
, .*
也可能匹配第二個反引號,具體取決於行的其余部分,然后整個表達式可能會失敗。 $1
指定,它指的是RE的第一個paren封閉部分(“反向引用”)。 在大圖中,所有這些的結果是包含反引號括號表達式的行將反引號(和反引號)中的部分替換為執行包含的Ruby表達式的結果值。 並且由於外部塊受到redo
,因此循環將立即重復而不重新運行while
條件。 這意味着得到的表達式也需要進行反引號評估。
替換反引號之間的一切line
與評估其中所包含的代碼紅寶石的結果。
>> line = "one plus two equals `1+2`"
>> line.gsub!(/`(.*?)`/) { eval($1) }
>> p line
=> "one plus two equals 3"
.*
匹配零個或多個字符, ?
使它不貪婪(即,它將采用最短的匹配而不是最長的匹配)。
$1
是匹配()
之間的東西的字符串。 在上面的例子中, $1
將被設置為"1+2"
。 eval
將字符串計算為ruby代碼。
line.gsub!(/
(。*?) /) { eval($1) }
1+1
,則eval將其替換為2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.