我有这段代码
my $line = "Data="3&";
my ($count) = ($line =~ /Data="([^&]+)/x);
print "$count\n"; # prints 3
my $count = ($line =~ /Data="([^&]+)/x);
print "$count\n"; #print 1
括号对结果有什么影响?
答案 0 :(得分:3)
首先,括号在Perl中具有与在大多数其他编程语言中相同的功能:消除评估顺序
在
的情况下my $count = ($line =~ /Data="([^&]+)/x)
它们强制正则表达式匹配在赋值之前发生。在这种情况下,它们没有区别,因为它们强制执行默认优先级
使用
my ($count) = ($line =~ /Data="([^&]+)/x)
右手括号与以前一样,并且是不必要的。但是($count)
将作业的左侧从简单的标量转换为标量列表
这很重要,因为它强加列表上下文,并且每个运算符和子例程调用在列表上下文中与标量上下文
具有不同的行为如果你看了
Regexp Quote-Like Operators
在perldoc perlop
中,您会看到正在使用的匹配m//
运算符
在列表上下文中,它更复杂,因为行为取决于正则表达式是否具有/g
(全局)修饰符以及它是否使用任何捕获。在这种情况下,使用单个捕获而没有/g
,这是相关的子句
这一切意味着在标量上下文中 - 第一个示例 - $count
将设置为 true 或 false 根据正则表达式模式是否匹配。在列表上下文 - 第二个示例中 - 它将被设置为捕获([^&]+)
的内容。如果匹配失败,则正则表达式匹配将返回空列表,因此$count
将设置为undef
答案 1 :(得分:2)
在这种情况下,parens强制左侧(LHS)进入列表上下文。某些子例程可以根据调用者是否需要列表或标量来做出决策,如果在不同的上下文中调用,其他子例程将返回Perl默认值(通常是意外的结果):
use warnings;
use strict;
my $list_count = context(); # scalar context requested
my @list = context(); # list context requested
my ($x, $y, $z) = context(); # list context requested
my @arr = want_array(); # sub decides what to return (list)
my ($x, $y, $z) = want_array(); # same (list)
my $first_elem = want_array(); # same (scalar)
sub context {
# this sub doesn't decide on context... it
# just returns the perl default... a list in
# list context, or the element count if in
# scalar context
return qw(1 2 3);
}
sub want_array {
my @array = qw(1 2 3);
# wantarray() can check if the caller wants a
# list returned... if so, it can do one thing,
# if not, it can do something else
return @array if wantarray;
# return value of element 0 if scalar context
# requested
return $array[0];
}