什么是Ruby编号的全局变量

时间:2011-07-13 03:48:30

标签: ruby ruby-1.9

值$ 1,$ 2,$',$`在Ruby中意味着什么?

2 个答案:

答案 0 :(得分:18)

它们是从最近的模式匹配中捕获的(就像在Perl中一样; Ruby最初从Perl中提取了很多语法,尽管它现在已经基本上得到了它:)。 $1$2等引用正则表达式中带括号的捕获:给定/a(.)b(.)c/$1将是ab之间的字符以及$2 bc之间的字符$`$'$&分别表示匹配整个正则表达式(本身位于perldoc perlvar)的字符串之前和之后的字符串。

实际上,只有在历史上,这些才有意义;您可以在\1中找到它,它通常可以很好地记录Perl变量的预期助记符和历史记录,并且大部分仍然适用于Ruby中的全局变量。编号的捕获是捕获反向引用正则表达式语法(\2:等)的替换; Perl在3.x版本的某个地方从前者切换到后者,因为在正则表达式之外使用反向引用语法过于复杂。 (当Perl 5推出时,解析器已被充分重写,语法再次可用,并立即重用于引用/“指针”.Ruby选择使用名称引用$&代替,更接近对于Lisp和Smalltalk风格;由于Ruby最初与Smalltalk风格的OO一样开始,这在语言上更有意义。)同样适用于&,在历史正则表达式语法中只是$& (但你不能在替换的替换部分之外使用它,所以它变成了变量$`)。 $'和{{1}}都是“可爱的”:来自匹配字符串的“反引号”和“前向引用”。

答案 1 :(得分:7)

此处列出了未编号的:

http://www.zenspider.com/Languages/Ruby/QuickRef.html#19

$1, $2 ... $N指的是正则表达式捕获组中的匹配项。

所以:

"ab:cd" =~ /([a-z]+):([a-z]+)/

会产生

$1 = "ab"
$2 = "cd"