【发布时间】:2016-07-13 01:58:19
【问题描述】:
我发现这是一种在一个语句中分配regex 捕获的方法:
$str1 = "Hello World";
($str2) = $str1 =~ m[(.+?)World];
print $str2 . "\n"; # output is "Hello "
为什么$str2 周围的括号是必要的?
【问题讨论】:
我发现这是一种在一个语句中分配regex 捕获的方法:
$str1 = "Hello World";
($str2) = $str1 =~ m[(.+?)World];
print $str2 . "\n"; # output is "Hello "
为什么$str2 周围的括号是必要的?
【问题讨论】:
Perl 的奇怪之处在于可以编写函数(内部是正则表达式)来理解需要返回的内容的上下文。
使用时:
$str2 = $str1 =~ m[(.+?)World];
正则表达式函数可以看到您想要返回一个标量值,因此如果匹配则分配1 的值,如果不匹配则分配0 的值(perl 没有true 和false 的常量)。但是当你添加括号时,函数知道你需要一个数组,你只是立即将数组的单个元素分配回一个标量值。
如果你这样做,它也会起作用
@str2 = $str1 =~ m[(.+?)World];
在这种情况下,您可以通过$str2[0] 获得您的价值
如果您想在自己的函数中根据上下文返回,可以使用 wantarray 关键字。
【讨论】:
尝试以下方法:
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/。【讨论】: