鉴于此代码:
#!/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);
我得到以下输出:
$VAR1 = {
'key1' => 'key2',
'value2' => undef
};
当我期望时:
$VAR1 = {
'key1' => 'value1',
'key2' => 'value2'
};
我知道散列是一种偶数大小的数组(正如我得到的“散列分配中的奇数个元素”警告所证明的那样),但散列元素只能是标量,为什么编译器会给它数组上下文?
我在直接分配给哈希时使用 CGI 模块的 param 函数发现了这一点。上面的 foo() 函数是对 CGI::param('mistyped_url_param') 的调用,它返回一个空数组,破坏(旋转?)哈希结构。
最佳答案
胖逗号不是特殊的哈希赋值运算符。它只是一个语法糖,意思是“自动引用以前的东西”
所以:
my $hash = {
key1 => foo(),
key2 => 'value2'
};
意思:
my $hash = {
'key1', foo(), 'key2', 'value2'
};
...这是一个列表,正如 willert 所说:
every expression in a list is evaluated in list context. You can get around this by calling
scalar foo()
关于arrays - 为什么 Perl 在声明时将哈希元素视为列表上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2332792/