如何存储数组元素内的哈希?

时间:2013-10-18 14:03:00

标签: arrays perl hash hashmap

背景

我有一个Perl模块,它使用一个数组作为输入/输出参数,如下所示:

Execute({inputfile => $req->{modules}.'filename', param => \@xchange});

在模块内部构建一个哈希并通过引用

返回
$param[0] = \%values;

这一切都很好(我认为),print Dumper @xchange[0];将输出我想要的内容

$VAR1 = { '33' => 'Title1', '53' => 'Title2', '21' => 'Title3' };


目标

我想循环遍历内容并逐个打印键/值对,例如像这样

%testhash = ('33' => 'Test1', '53' => 'Test2', '21' => 'Test3' );

foreach $key (keys %testhash) {
    print "LOOP: $key, value=$testhash{$key}\n";
}

此循环确实按预期工作,并通过print Dumper \%testhash;输出转储我的testhash,与上面的数组元素相同

$VAR1 = { '33' => 'Test1', '53' => 'Test2', '21' => 'Test3' };


问题

现在的麻烦似乎是虽然两个结构看起来都是同一类型我无法理解,但如何正确访问存储在@xchange [0]中的返回哈希。

我确实尝试了%realhash = @xchange[0];%realhash = \@xchange[0];,但print Dumper \%realhash;分别会输出$VAR1 = { 'HASH(0xa7b29c0)' => undef };$VAR1 = { 'REF(0xa7833a0)' => undef };

所以我要么需要一种方法来在一个干净的新哈希中获取@xchange [0]的内容,或者是在@xchange [0]元素内部对哈希进行循环的方法。

我想我对整个哈希引用概念感到不知所措,但我在这里不知所措,想不出谷歌的另一种方式。

3 个答案:

答案 0 :(得分:6)

$xchange[0]是哈希引用。使用解除引用运算符%{...}将其作为哈希值进行访问。

%realhash = %{$xchange[0]};

答案 1 :(得分:4)

@xchange[0]是标量值,它包含对哈希的引用。将其分配给哈希时

%hash = @xchange[0];

引用被字符串化为类似HASH(0xa7b29c0)的内容,并且您会收到警告

Scalar value @xchange[0] better written as $xchange[0] at ...
Reference found where even-sized list expected at ...

也就是说,你得到这些警告,除非你是如此愚蠢以至于不能用use warnings打开警告。

第一个意味着它所说的。第二个意味着您分配给散列的列表应该具有偶数个元素:每个键一个值。你只传递了一个“密钥”(Perl用作密钥的东西)。然后该值变为undef,如Data::Dumper输出中所述:

$VAR1 = { 'HASH(0xa7b29c0)' => undef }

您需要做的是取消参考参考。

my $href = $xchange[0];
my %hash  = %$href;           # using a transition variable
my %hash2 = %{ $xchange[0] }  # using support curly braces

答案 2 :(得分:1)

perldsc

use warnings;
use strict;
use Data::Dumper; 
$Data::Dumper::Sortkeys=1;

my %testhash = ('33' => 'Test1', '53' => 'Test2', '21' => 'Test3' );

# Add hash as first element of xchange AoH
my @xchange = \%testhash;

# Derefererence 1st element of AoH as a hash
my %realhash = %{ $xchange[0] };

# Dump new hash
print Dumper(\%realhash);

__END__

$VAR1 = {
          '21' => 'Test3',
          '33' => 'Test1',
          '53' => 'Test2'
        };