2017-06-17 103 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