我正在尝试使用切片初始化哈希:
use warnings;
use strict;
use Data::Dump qw(dump);
my %h;
my $a=['a','b'];
@h{@$a}=(1)x@$a;
dump(%h);
这很好,但是如果我尝试做一个子哈希,例如%h{test}
@h{test}{@$a}=(1)x@$a;
我收到错误:
Scalar value @h{test} better written as $h{test} at ./p.pl line 14.
syntax error at ./p.pl line 14, near "}{"
Execution of ./p.pl aborted due to compilation errors.
答案 0 :(得分:8)
您应该使用@{ $h{test} }{ @$a }=(1)x@$a;
,因为哈希包含哈希引用,而不是哈希。
use warnings;
use strict;
use Data::Dumper;
my %h;
my $a=['a','b'];
@{ $h{test} }{ @$a }=(1)x@$a;
print Dumper(\%h);
输出是:
$VAR1 = {
'test' => {
'a' => 1,
'b' => 1
}
};
答案 1 :(得分:-1)
编译器会看到' @'并且想到自己' array'然后看到' {'并说等等,什么?这是一个哈希索引指标。游戏胜过男人。'所以把@变成$。