为什么(a => 1,b => 2){a}语法错误?

Car*_*sap 4 perl

我想在表达式中使用哈希.没问题:

use strict;
use warnings;
my %h = (a=>1, b=>2);
my $h = $h{a};
print "h='$h'\n";
Run Code Online (Sandbox Code Playgroud)

但由于我只提到它一次,我不想命名它.天真地用哈希内容替换$ h不起作用.以下代码在"){"的第3行产生语法错误:

use strict;
use warnings;
my $x = (a=>1, b=>2){a};
print "x='$x'\n";
Run Code Online (Sandbox Code Playgroud)

我知道以下是实现我需要的方法:

use struct;
use warnings;
my $y = {a=>1, b=>2}->{a};
print "y='$y'\n";
Run Code Online (Sandbox Code Playgroud)

为什么第二个例子不起作用?

编辑1:这是一个MVCE.在现实生活中,我的哈希键(本例中为'a')不是常量.

编辑2:关于我的动机更多一点:我不想在我的代码中使用不必要的变量范围,所以如果我将%h的范围限制在它真正属于的范围,我会这样:

use strict;
use warnings;
my $h;
{
    my %h = (a=>1, b=>2);
    $h = $h{a};
}
print "h='$h'\n";
Run Code Online (Sandbox Code Playgroud)

我不想将%h留在范围内以获得比我需要的代码更多的代码,但是使用额外的块来编写代码段也很笨拙.这就是为什么我正在寻找一种干净的单行方式来完成任务.

ste*_*ieb 5

my $x = (a=>1, b=>2){a};,这不代表哈希.这是一个包含以下值的列表:'a', 1, 'b', 2.这个=>又名胖子逗号只是一个美化的逗号,其特点是引用了左侧的值.它并不暗示我们正在处理/创建哈希.例:

my @array = ('a' => 1 => 'b' => 2);
Run Code Online (Sandbox Code Playgroud)

要从1显示的原始代码中获取值,您必须这样做my $x = (a=>1, b=>2)[1];.

您使用的hashref方法:my $y = {a=>1, b=>2}->{a};是使用匿名哈希的标准方法.

  • @MaxLybbert那是因为`print` /`say` [将括号解释为包含参数](http://perldoc.perl.org/functions/print.html):"注意不要跟随`print`关键字左括号,除非你想要相应的右括号来终止print的参数;在所有参数周围加上括号(或插入一个`+`,但看起来不那么好). (3认同)
  • @MaxLybbert`(...)[1]`是[list slice](http://perldoc.perl.org/perldata.html#Slices)并且工作得很好. (2认同)