如果我有以下
my %big = ();
my %a = {x => 1, y => 1};
my %b = {z => 1};
并希望以%a
内的%b
和%big
结束,所以我有
$VAR1 = {
'b' => {
'x' => 1
},
'a' => {
'y' => 1,
'x' => 1
}
};
问题
如何编写循环会将%a
和%b
等多个哈希值插入%big
?
更新
根据答案我用
解决了问题for my $x (@{$c->{slaves}}) {
$big{$x} = {xx::getFsList($x)};
}
答案 0 :(得分:2)
你不需要循环,
my %a = (x => 1, y => 1);
my %b = (z => 1);
my %big = (a => \%a, b => \%b);
答案 1 :(得分:2)
如上所述,您的代码有几个问题。
Curly括号引入哈希引用,而不是哈希。哈希是从列表创建的,因此请使用括号:
my %a = (x => 1, y => 1);
my %b = (z => 1);
如果您使用our %a
和our %b
代替my
并使用strict refs
,则可能会有所需要。这是因为符号引用仅适用于全局变量:
for my $hash_name (qw( a b )) {
no strict 'refs';
$big{$hash_name} = \%{$hash_name};
}
你可能不需要它,因为你已经知道有两个名为a
和b
的哈希,所以为什么要根据它们的名字进行循环呢?如果您确实想要保存一些击键,可以使用字符串eval
生成代码:
for my $hash_name (qw( a b )) {
eval "\$big{$hash_name} = \\%$hash_name";
}
我认为比
更具可读性my %big = ( a => \%a,
b => \%b,
);
要创建来自函数的列表哈希,可以使用
my $char = 'a';
while (my @list = func()) {
$big{ $char++ } = { @list };
}