1

的背景

我有一个 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];and %realhash = \@xchange[0];,但随后print Dumper \%realhash;会分别输出$VAR1 = { 'HASH(0xa7b29c0)' => undef };or $VAR1 = { 'REF(0xa7833a0)' => undef };

所以我要么需要一种方法来获取干净的新哈希中的@xchange[0] 的内容,要么需要一种方法来遍历@xchange[0] 元素内的哈希。

我想我被整个哈希引用概念搞砸了,但我在这里不知所措,想不出另一种方法来谷歌搜索它。

4

3 回答 3

6

$xchange[0]是一个哈希引用。使用解引用运算符%{...}将​​其作为散列访问。

%realhash = %{$xchange[0]};
于 2013-10-18T14:08:32.560 回答
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
于 2013-10-18T14:19:43.613 回答
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'
        };
于 2013-10-18T14:11:51.323 回答