我需要向哈希数组中的哈希条目添加一个新的键值对。下面是一些不起作用的示例代码(仅使用一个数组条目进行简化)。
打印语句的输出仅包含相同的一个条目。
my @AoH;
push @AoH, { TEST1 => 'testvalue' };
for my $hash (@AoH)
{
$hash{'TEST2'} = 'testvalue2';
print Dumper($hash);
}
我做错了什么?
这段代码看起来有点奇怪,所以我假设它是这样完成的,以便在这里简要展示它,但是修复代码需要做的主要事情是更改:
$hash{'TEST2'} = 'testvalue2';
至:
$$hash{'TEST2'} = 'testvalue2';
或:
$hash->{'TEST2'} = 'testvalue2';
额外的
$
或 ->
取消引用哈希引用 $hash
。由于两者都不存在,它将 $hash{'TEST2'}
视为不同的变量:%hash
(不是 $hash
)并将 testvalue2
分配给它。您会收到一条很好的错误消息:
Global symbol "%hash" requires explicit package name at - line XX
如果您尝试使用以下命令运行此代码:
use strict;
use warnings;
一开始...你应该始终这样做,所以从现在开始每次都这样做。
use strict;
use warnings;
use Data::Dumper;
my @AoH=();
my %data_source_hash=(
TEST1 => 'testvalue1',
TEST2 => 'testvalue2'
);
# adds whole hash as the array element
push @AoH,{ %data_source_hash };
print Dumper(@AoH);
@AoH=();
print "---------------------------\n";
# adds each hash $key, $value pair as an element
while ( my ($key, $value) = each %data_source_hash )
{
push @AoH, { $key => $value };
}
print Dumper(@AoH);
@AoH=();
print "---------------------------\n";
# adds extra hash entry to each array element
push @AoH, { TEST1 => 'testvalue' };
push @AoH, { TEST3 => 'testvalue3' };
foreach my $el (@AoH)
{
my $key = 'TEST2';
$$el{$key} = $data_source_hash{$key};
}
print Dumper(@AoH);