使用括号和仅一个变量

phi*_*ogg 31 perl

我有时会看到像这样的Perl代码:

my ( $variable ) = blah....
Run Code Online (Sandbox Code Playgroud)

将括号括在一个变量周围有什么意义?我认为括号仅在声明多个变量时使用,例如:

my ( $var1, $var2, $var3 ) = blah...
Run Code Online (Sandbox Code Playgroud)

Ωme*_*ega 38

存在以下几种情况:

  1. 数组在右侧时

    my @array = ('a', 'b', 'c');
    my  $variable  = @array;           #  3   size of @array
    my ($variable) = @array;           # 'a'  $array[0]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 列表在右侧时

    my  $variable  = qw/ a b c d /;    # 'd'  last  item of the list
    my ($variable) = qw/ a b c d /;    # 'a'  first item of the list
    
    Run Code Online (Sandbox Code Playgroud)
  3. 具有变量(数组/标量)返回值的子例程

    sub myFunction {
      ...
      return (wantarray() ? @array : $scalar);
    }
    my  $variable  = myFunction(...);  # $scalar   from the subroutine
    my ($variable) = myFunction(...);  # $array[0] from the subroutine
    
    Run Code Online (Sandbox Code Playgroud)


mob*_*mob 19

括号创建一个列表上下文,该上下文会影响如何评估赋值的右侧.

相比

my $x = grep { /s/ } qw(apples bananas cherries);
print $x;
Run Code Online (Sandbox Code Playgroud)

my ($x) = grep { /s/ } qw(apples bananas cherries);
print $x;
Run Code Online (Sandbox Code Playgroud)

你只想抓住列表的第一个元素并丢弃其余元素时,经常会使用这种结构.


kni*_*ttl 7

我不是Perl pro(无论如何,我不是),但AFAIK与列表有关.Perl有不同的上下文(标量,列表).使用($var)开关列出上下文$var是标量上下文.

my $var = (1, 2, 4); # $var = 4 (last element)
my ($var) = (1, 2, 4); # $var = 1
Run Code Online (Sandbox Code Playgroud)

如果这是完全错误的话,请低估这个答案:)


TLP*_*TLP 7

你混淆了两件不同的事情.首先,当使用my声明多个变量时,需要使用括号:

my $foo, $bar;  
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它被认为是两个不同的陈述:

my $foo;
$bar;
Run Code Online (Sandbox Code Playgroud)

所以,你需要括号组合在一起的参数转换为一个参数列表的功能 my:

my($foo, $bar);
Run Code Online (Sandbox Code Playgroud)

其次,为了调用列表上下文,您有明确的分组:

$foo, $bar = "a", "b"; # wrong!
Run Code Online (Sandbox Code Playgroud)

将被视为三个单独的陈述:

$foo;
$bar = "a";
"b";
Run Code Online (Sandbox Code Playgroud)

但是,如果使用括号进行分组$foo$bar进入列表,则赋值运算符将使用列表上下文:

($foo, $bar) = ("a", "b");
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果你删除RHS括号,你也会遇到一个hickup:

($foo, $bar) = "a", "b"; # Useless use of a constant (b) in void context
Run Code Online (Sandbox Code Playgroud)

但这是因为=运算符的优先级高于逗号,,您可以在perlop中看到.如果你试试:

my @array = ("a", "b");
($foo, $bar) = @array;
Run Code Online (Sandbox Code Playgroud)

您将获得没有括号的所需行为.

现在要完成圆圈,让我们删除上面的列表上下文,看看会发生什么:

my @array = ("a", "b");
$foo = @array;
print $foo;
Run Code Online (Sandbox Code Playgroud)

这打印2,因为数组在标量上下文中计算,标量上下文中的数组返回它们包含的元素数.在这种情况下,它是2.

因此,诸如这些语句使用列表上下文:

my ($foo) = @array;          # $foo is set to $array[0], first array element
my ($bar) = ("a", "b", "c"); # $bar is set to "a", first list element
Run Code Online (Sandbox Code Playgroud)

它是一种覆盖标量赋值中隐含的标量上下文的方法.为了比较,这些分配在标量上下文中:

my $foo = @array;            # $foo is set to the number of elements in the array
my $bar = ("a", "b", "c");   # $bar is set to "c", last list element
Run Code Online (Sandbox Code Playgroud)