为什么这会在foo和bar之间返回字符串:
my ($var) = $my_string =~ /foo(.*)bar/;
如果有击中,则返回数字1,如果没有匹配则返回任何内容:
my $var = $my_string =~ /foo(.*)bar/;
具体来说,变量周围的括号是什么?
答案 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)