2017-06-17 82 views
0

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

做括號對結果有什麼影響?

+0

的括號強制使用列表賦值運算符,這會導致在列表上下文中評估正則表達式匹配。請參閱[小型教程:標量與列表分配運算符](http://www.perlmonks.org/?node_id=790129)。正則表達式的匹配結果取決於在標量或列表上下文中是否進行了評估。 – ikegami

回答

3

首先,括號具有相同的功能Perl,那麼在大多數其他編程語言做:消除歧義評價

的順序在

my $count = ($line =~ /Data="([^&]+)/x) 

的情況下,他們迫使正則表達式匹配在作業之前發生。在這種情況下,他們沒有什麼區別,因爲他們執行的默認優先級

隨着

my ($count) = ($line =~ /Data="([^&]+)/x) 

右手對括號是做和以前一樣,而且是不必要的。但是($count)變成從一個簡單的標量分配的左手側成標量的列表

這是至關重要的,因爲它規定列表上下文,以及各運營商和子程序調用在列表中的不同的行爲從

如果你在閱讀perldoc perlop Regexp Quote-Like Operators 標量上下文語境,你會看到比賽m//運營商正在使用

  • 搜索字符串的模式匹配,並在標量上下文,如果它成功,如果失敗

在列表上下文,因爲行爲依賴於正則表達式是否具有/g它更復雜返回真,假(全局)修飾符以及它是否使用任何捕獲。在這種情況下,用一個單一的捕獲和不/g,這是有關條款

  • 返回由在括號中的模式

匹配的子表達式的這一切都意味着,在一個列表標量上下文 - 第一個示例 - $count將設置爲truefalse根據正則表達式模式是否匹配。在列表上下文-第二個示例 - 它將被設置爲捕獲的內容([^&]+)。如果匹配失敗,那麼正則表達式匹配將返回一個空列表,所以$count將被設置爲undef

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]; 
} 
+0

什麼是使用警告; 使用嚴格; – alex

+0

@alex [這裏是](https://perlmaven.com/always-use-strict-and-use-warnings)一個相當不錯的教程。總是'嚴格使用';'使用警告;';) – stevieb