为什么Perl在声明时将哈希元素视为列表上下文?

Mar*_*ald 3 arrays perl hash

鉴于此代码:

#!/usr/bin/perl -w

use strict;
use warnings;

sub foo {
    return wantarray ? () : "value1";
}

my $hash = {
    key1 => foo(),
    key2 => 'value2'
};

use Data::Dumper;
print Dumper($hash);
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

$VAR1 = {
  'key1' => 'key2',
  'value2' => undef
};
Run Code Online (Sandbox Code Playgroud)

当我期待:

$VAR1 = {
  'key1' => 'value1',
  'key2' => 'value2'
};
Run Code Online (Sandbox Code Playgroud)

我知道散列是一种偶数大小的数组(由我所得到的"散列分配中的奇数元素数量"警告证明)但是散列元素只能是一个标量,为什么编译器会给出它的数组上下文?

我直接分配给哈希时使用CGI模块的param函数找到了这个.上面的foo()函数是对CGI :: param('mistyped_url_param')的调用,它返回一个空数组,破坏(旋转?)哈希结构.

Que*_*tin 7

胖逗号不是特殊的哈希赋值运算符.它只是一段语法糖意味着"自动引用前一个东西"

所以:

my $hash = {
    key1 => foo(),
    key2 => 'value2'
};
Run Code Online (Sandbox Code Playgroud)

手段:

my $hash = {
    'key1', foo(), 'key2', 'value2'
};
Run Code Online (Sandbox Code Playgroud)

......这是一个清单,正如威勒特所说:

列表中的每个表达式都在列表上下文中计算.你可以打电话来解决这个问题scalar foo()

  • 列表中的每个表达式都在列表上下文中计算.不过,你可以通过调用"scalar foo()"来解决这个问题. (5认同)
  • 除非您引用该数组,否则将对其内容进行评估.所以'我的@ a1 =(1,2); my @ a2 =(@ a1,3,5,8);',第二个语句被评估为'((1,2),3,5,5)',@ a2的长度是5,而不是4.有效地忽略空列表. (2认同)
  • `wantarray`是一个不幸的遗产名称. (2认同)