在Perl中获取内部哈希

时间:2018-12-05 23:01:11

标签: perl

在花费大量时间进行调试并了解了代码行为的原因之后,我决定寻求帮助。它应该是非常基本的东西,但是我似乎无法理解它为什么起作用(实际上不起作用)的原因。一段代码:

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

我该如何解决这个问题?

2 个答案:

答案 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} };