我有这样的代码perl中()的含义是什么?
my $line = "Data="3&";
my ($count) = ($line =~ /Data="([^&]+)/x);
print "$count\n"; # prints 3
my $count = ($line =~ /Data="([^&]+)/x);
print "$count\n"; #print 1
做括号对结果有什么影响?
我有这样的代码perl中()的含义是什么?
my $line = "Data="3&";
my ($count) = ($line =~ /Data="([^&]+)/x);
print "$count\n"; # prints 3
my $count = ($line =~ /Data="([^&]+)/x);
print "$count\n"; #print 1
做括号对结果有什么影响?
首先,括号具有相同的功能Perl,那么在大多数其他编程语言做:消除歧义评价
的顺序在
my $count = ($line =~ /Data="([^&]+)/x)
的情况下,他们迫使正则表达式匹配在作业之前发生。在这种情况下,他们没有什么区别,因为他们执行的默认优先级
随着
my ($count) = ($line =~ /Data="([^&]+)/x)
右手对括号是做和以前一样,而且是不必要的。但是($count)
变成从一个简单的标量分配的左手侧成标量的列表
这是至关重要的,因为它规定列表上下文,以及各运营商和子程序调用在列表中的不同的行为从
如果你在阅读perldoc perlop
Regexp Quote-Like Operators 标量上下文语境,你会看到比赛m//
运营商正在使用
在列表上下文,因为行为依赖于正则表达式是否具有/g
它更复杂返回真,假(全局)修饰符以及它是否使用任何捕获。在这种情况下,用一个单一的捕获和不/g
,这是有关条款
匹配的子表达式的这一切都意味着,在一个列表标量上下文 - 第一个示例 - $count
将设置为true或false根据正则表达式模式是否匹配。在列表上下文-第二个示例 - 它将被设置为捕获的内容([^&]+)
。如果匹配失败,那么正则表达式匹配将返回一个空列表,所以$count
将被设置为undef
在这种情况下,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];
}
的括号强制使用列表赋值运算符,这会导致在列表上下文中评估正则表达式匹配。请参阅[小型教程:标量与列表分配运算符](http://www.perlmonks.org/?node_id=790129)。正则表达式的匹配结果取决于在标量或列表上下文中是否进行了评估。 – ikegami