鉴于此代码:
#!/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')的调用,它返回一个空数组,破坏(旋转?)哈希结构.
胖逗号不是特殊的哈希赋值运算符.它只是一段语法糖意味着"自动引用前一个东西"
所以:
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()