【问题标题】:What are Ruby's numbered global variables什么是 Ruby 的编号全局变量
【发布时间】:2011-07-13 03:48:30
【问题描述】:

$1、$2、$'、$` 在 Ruby 中的含义是什么?

【问题讨论】:

  • 我认为他们的意思是 Ruby 的开发者认为他通过选择隐蔽的变量名很聪明。
  • 实际上,你必须为他们责备 lwall; Ruby 从 Perl 批量导入它们。
  • @geekosaur,不一定,据我记得 Larry Wall 从 awk 导入它们。 Rubyist 可以在 require "English" 之后使用 $POSTMATCH 来表示 $',$PREMATCH 来表示 $`。

标签: ruby ruby-1.9


【解决方案1】:

它们是从最近的模式匹配中捕获的(就像在 Perl 中一样;Ruby 最初从 Perl 中提取了很多语法,尽管现在它在很大程度上已经克服了它:)。 $1$2 等指的是正则表达式中带括号的捕获:给定/a(.)b(.)c/$1 将是ab$2 之间的字符@ 和@ 之间的字符987654329@。 $`$' 分别表示匹配整个正则表达式(在 $& 中)的字符串之前和之后的字符串。

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

【讨论】:

    【解决方案2】:

    这里列出了未编号的:

    https://www.zenspider.com/ruby/quickref.html#pre-defined-variables

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

    所以:

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

    会成功

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

    【讨论】:

    • 好像你在冒号后面的表达式中错过了一个左括号([)。应该是 "ab:cd" =~ /([a-z]+):([a-z]+)/
    猜你喜欢
    • 2012-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多