在花费大量时间进行调试并了解了代码行为的原因之后,我决定寻求帮助。它应该是非常基本的东西,但是我似乎无法理解它为什么起作用(实际上不起作用)的原因。一段代码:
use Data::Dumper;
my (%p_all,%e_all);
get_e(\%e_all);
my %e_abs = $e_all{"ex_abs"};
my %e = $e_all{"ex"};
print Dumper(\%e_abs);
sub get_e{
my ($ex_href) = @_;
my $counter = 5;
my $exec1 = "ABC";
my $exec2 = "xyz";
$ex_href->{"ex_abs"}{$exec1} += $counter;
$ex_href->{"ex"}{$exec2} += $counter;
}
输出:
$VAR1 = {
'HASH(0x9e2a20)' => undef
};
如果我想做:
my %e_abs = %{$e_all{"ex_abs"}};
它将失败,并显示以下错误:
can't use an undefined value as a HASH reference
我该如何解决这个问题?
答案 0 :(得分:4)
$e_all{ex_abs}
包含哈希引用,要将其分配给哈希,您首先需要取消引用:
my %e_abs = %{ $e_all{"ex_abs"} };
my %e = %{ $e_all{"ex"} };
或者,在最新的Perl版本中,
my %e_abs = $e_all{"ex_abs"}->%*;
my %e = $e_all{"ex"}->%*;
它输出
$VAR1 = {
'ABC' => 5
};
除非未定义$e_all{ex_abs}
,否则不会失败并显示“无法使用未定义的值...”。
请注意,启用warnings后,Perl还会告诉我
Reference found where even-sized list expected at 1.pl line 10.
Reference found where even-sized list expected at 1.pl line 11.
答案 1 :(得分:3)
始终使用use strict; use warnings qw( all );
;它会发现问题所在。
Reference found where even-sized list expected at a.pl line 6.
Reference found where even-sized list expected at a.pl line 7.
哈希值只能是标量,因此应使用以下内容:
my $e_abs = $e_all{ex_abs};
my $e = $e_all{ex};
print Dumper($e_abs);
或者,您可以分配一个哈希并将键和值从旧哈希复制到新哈希中,但这不必要地昂贵。可以这样做:
my %e_abs = %{ $e_all{ex_abs} };