在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}}
。