在Perl中使用切片初始化一组哈希键

在Perl中使用切片初始化一组哈希键,perl,hash,Perl,Hash,我正在尝试使用切片初始化哈希: 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.

我正在尝试使用切片初始化哈希:

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.

您应该使用
{$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
                    }
        };

另请参见:

编译器看到“@”并认为自己是“数组”,然后看到“数组”{然后说‘等等,什么?这是一个散列索引指示器。游戏结束了。所以把@转换成$。

谢谢瓦迪姆。这是可行的,但语法让我困惑:)请看我提供的链接。语法并不简单,但实际上是干净易懂的。我每次做这种事情时仍然使用文档;)。语法很简单,如果表达得当;请看@ysth诚然,我个人喜欢使用
map
%{$h{test}}=map{${$}}@$a
或者更明确的
$h{test}->{$}=1 foreach@$a;
这是行不通的,因为
@$a
将在标量上下文中使用,您将得到
$h{test 2}=(a,b)
。可能是这样,但这不是编译器所抱怨的。我相信这不是关于有效的语法,而是关于完成事情。空字符串是完美有效的perl程序,但OP不想要它:)。
%h{test}
没有意义。你是说
$h{test}
引用的哈希吗?那将是
%{$h{test}}