我有這樣的代碼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