perl中()的含义是什么?

时间:2017-06-17 16:46:35

标签: 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

括号对结果有什么影响?

2 个答案:

答案 0 :(得分:3)

首先,括号在Perl中具有与在大多数其他编程语言中相同的功能:消除评估顺序

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

它们强制正则表达式匹配在赋值之前发生。在这种情况下,它们没有区别,因为它们强制执行默认优先级

使用

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

右手括号与以前一样,并且是不必要的。但是($count)将作业的左侧从简单的标量转换为标量列表

这很重要,因为它强加列表上下文,并且每个运算符和子例程调用在列表上下文中与标量上下文

具有不同的行为

如果你看了 Regexp Quote-Like Operatorsperldoc perlop中,您会看到正在使用的匹配m//运算符

  • 在字符串中搜索模式匹配,在标量上下文中如果成功则返回true,如果失败则返回false

在列表上下文中,它更复杂,因为行为取决于正则表达式是否具有/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];
}