【问题标题】:Assign regex capture in one statement在一个语句中分配正则表达式捕获
【发布时间】:2016-07-13 01:58:19
【问题描述】:

我发现这是一种在一个语句中分配regex 捕获的方法:

$str1 = "Hello World";
($str2) = $str1 =~ m[(.+?)World];
print $str2 . "\n";  # output is "Hello "

为什么$str2 周围的括号是必要的?

【问题讨论】:

    标签: regex perl capture


    【解决方案1】:

    Perl 的奇怪之处在于可以编写函数(内部是正则表达式)来理解需要返回的内容的上下文。

    使用时:

    $str2 = $str1 =~ m[(.+?)World];
    

    正则表达式函数可以看到您想要返回一个标量值,因此如果匹配则分配1 的值,如果不匹配则分配0 的值(perl 没有truefalse 的常量)。但是当你添加括号时,函数知道你需要一个数组,你只是立即将数组的单个元素分配回一个标量值。

    如果你这样做,它也会起作用

    @str2 = $str1 =~ m[(.+?)World];
    

    在这种情况下,您可以通过$str2[0] 获得您的价值

    如果您想在自己的函数中根据上下文返回,可以使用 wantarray 关键字。

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      use feature qw( say );
      
      my @a = qw( a b c );
      
      my $x   = @a;
      my ($y) = @a;
      
      say $x;  # This outputs 3
      say $y;  # This outputs a
      

      使赋值运算符的 LHS 看起来“listy”会影响赋值运算符的 RHS 计算的上下文。

      因此,括号会影响计算正则表达式匹配运算符的上下文。

      • 在标量上下文中评估正则表达式匹配运算符时,它会返回是否找到匹配项。这允许您执行if (/pat/)
      • 在列表上下文中评估正则表达式匹配运算符时,它会返回它捕获的字符串。这允许您执行my @matches = /pat/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多