为什么需要括号来保存Perl中正则表达式的结果?

时间:2014-05-30 20:32:09

标签: regex perl

为什么这会在foo和bar之间返回字符串:

my ($var) = $my_string =~ /foo(.*)bar/;

如果有击中,则返回数字1,如果没有匹配则返回任何内容:

my $var = $my_string =~ /foo(.*)bar/;

具体来说,变量周围的括号是什么?

3 个答案:

答案 0 :(得分:2)

与Perl中的许多内容一样,该表达式的结果因放入的上下文而异。

模式匹配运算符将返回列表联系人中的捕获列表(您的第一个示例)。如果在标量上下文(第二个示例)中计算运算符,则返回一个布尔值,指示是否匹配。

要回答您的具体问题,请将{p}围绕$var强制进入列表上下文,并将模式匹配返回的列表的第一个元素分配给$var

这实际上与这些陈述相同:

my @matches = $my_string =~ /foo(.*)bar/;
my $var = $matches[0];

答案 1 :(得分:1)

因为正则表达式匹配运算符返回一个列表,所以如果需要列表值,则必须提供列表上下文。在括号中,您提供了一个列表上下文,因此变量设置为...但只保存返回的第一个值。如果您的正则表达式返回多个子匹配,则您需要提供多个变量,如:

($a,$b) = $string =~ /\s+(\S+)\s+(\S+)/;

在裸(非括号)情况下,您提供标量上下文,标量上下文中的匹配运算符返回一个布尔值,指示模式是否匹配。

答案 2 :(得分:1)

因为在第一种情况下,您在列表上下文中进行正则表达式匹配,并且http://perldoc.perl.org/perlrequick.html在这种情况下说:

  

在列表上下文中,匹配/正则表达式/分组将返回匹配值列表($ 1,$ 2,...)

在第二种情况下,正则表达式返回true(1)