在一个语句中分配正则表达式捕获

时间:2016-07-13 01:58:19

标签: regex perl capture

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

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

为什么$str2周围的方括号必须?

2 个答案:

答案 0 :(得分:1)

Perl很奇怪,可以编写函数(在内部使用正则表达式)来理解需要返回的内容。

使用时:

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

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

如果你这样做也会有用

false

在这种情况下,您可以使用@str2 = $str1 =~ m[(.+?)World];

获取价值

如果您想根据自己的功能中的上下文返回,可以使用$str2[0]关键字。

答案 1 :(得分:1)

尝试以下方法:

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看起来像#34; listy"影响评估赋值运算符的RHS的上下文。

因此,parens会影响评估正则表达式匹配运算符的上下文。

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