【问题标题】:What does $1 mean in Perl?在 Perl 中,1 美元是什么意思?
【发布时间】:2010-11-05 09:31:01
【问题描述】:

$1 在 Perl 中是什么意思?此外,2 美元是什么意思? 有多少个 $number 变量?

【问题讨论】:

  • 您最好查看类似Learning Perl 之类的内容或其他解释该语言基础知识的 Perl 简介。
  • 现在布莱恩,你为什么要推荐那本书?僧侣毕竟是慈善机构....

标签: regex perl


【解决方案1】:

数字变量是您应用的最后一个成功匹配或替换运算符的匹配项:

my $string = 'abcdefghi';

if ($string =~ /(abc)def(ghi)/) {
    print "I found $1 and $2\n";
}

在使用$1 等之前,始终测试匹配或替换是否成功。否则,您可能会从另一个操作中拾取剩余物。

Perl 正则表达式记录在perlre

【讨论】:

  • 如果 $1 到 $9 始终存在,那么如果少于九个匹配项有什么价值?
  • $1 到 $9 并不总是存在。我认为吉姆误读了手册页。我引用了相关部分:“您可以有任意数量的括号。如果您有超过 9 个子字符串,变量 $10, $11, ... 指的是相应的子字符串。在模式中,\10,\11等. 如果在反向引用之前至少有那么多左括号,则引用子字符串。否则(为了向后兼容)\10 与 \010 相同,退格,\11 与 \011 相同,制表符. 等等。(\1 到 \9 总是反向引用。)"
  • -1 表示半真半假。它们是捕获的结果,而不是整个比赛。它们仅在成功匹配时设置,这意味着您需要在使用它们之前检查匹配是否成功。正如 Alan 已经指出的那样,您混淆了备用反斜杠符号的特殊情况行为。
  • 我已经完全用事实替换了答案。原始答案中的几乎所有内容都是错误的。
【解决方案2】:

$number 变量包含与 capture groups ( ... ) 匹配的字符串部分,如果匹配成功的话,您的最后一次正则表达式匹配。

例如,取如下字符串:

$text = "the quick brown fox jumps over the lazy dog.";

声明之后

$text =~ m/ (b.+?) /;

$1 等于文本“brown”。

【讨论】:

  • 如果有多个匹配项怎么办?我们能以某种方式得到所有的比赛吗?
  • @user1289 这就是其他数字(2 美元、3 美元……)的用途。
  • @user1289 - 您的正则表达式需要多个括号来捕获多个值。您不能只使用一个捕获条件(例如 m/ (b.?) /)来抓取字符串中以“b”开头的所有单词(前面的示例只会捕获第一个实例)。
  • 我认为提到所有捕获变量($1、$2 等)都在本地范围内也很重要。一旦你离开这个块,它们是未定义的。
【解决方案3】:

这些被称为“匹配变量”。如前所述,它们包含上次正则表达式匹配的文本。

更多信息在 Essential Perl 中。 (Ctrl + F for 'Match Variables' 找到相应的部分。)

【讨论】:

    【解决方案4】:

    变量 $1 .. $9 也是只读变量,因此您不能为它们隐式赋值:

    $1 = 'foo';打印 $1;

    这将返回错误:在脚本第 1 行尝试修改只读值。

    您也不能使用数字作为变量名的开头:

    $1foo = 'foo';打印 $1foo;

    上面也会返回错误。

    【讨论】:

    • Re "implicitly":你不是说"explicitly"(反义词)吗?
    【解决方案5】:

    正如其他人所指出的,$x 是正则表达式的捕获变量,允许您引用匹配模式的部分。

    Perl 还支持命名捕获,这在某些情况下可能更容易让人记住。

    给定输入:111 222

    /(\d+)\s+(\d+)/
    

    $1 是 111

    $2 是 222

    也可以说:

    /(?<myvara>\d+)\s+(?<myvarb>\d+)/
    

    $+{myvara} 是 111

    $+{myvarb} 是 222

    【讨论】:

      【解决方案6】:

      $1、$2 等将包含上次 成功 匹配的捕获值 - 在访问它们之前检查匹配是否成功非常重要,即

       if ( $var =~ m/( )/ ) { # use $1 etc... }
      

      问题示例 - $1 在下面的两个打印语句中都包含“Quick”:

      #!/usr/bin/perl
      
      'Quick brown fox' =~ m{ ( quick ) }ix;
      print "Found: $1\n";
      
      'Lazy dog' =~ m{ ( quick ) }ix;
      print "Found: $1\n";
      

      【讨论】:

        【解决方案7】:

        我怀疑在 32 位编译的 Perl 二进制文件上可能有多达 2**32 -1 编号的匹配变量。

        【讨论】:

        • 是的,这确实回答了三个问题中的最后一个。但也许添加一些关于实用性的东西?
        【解决方案8】:

        既然您询问了捕获组,您可能也想知道$+... 很有用...

        use Data::Dumper;
        $text = "hiabc ihabc ads byexx eybxx";
        while ($text =~ /(hi|ih)abc|(bye|eyb)xx/igs)
        {
            print Dumper $+;
        }
        

        输出:
        $VAR1 = '嗨';
        $VAR1 = 'ih';
        $VAR1 = '再见';
        $VAR1 = 'eyb';

        【讨论】:

          猜你喜欢
          • 2010-12-28
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          • 2018-03-05
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 2020-01-20
          相关资源
          最近更新 更多