簡體   English   中英

如何存儲數組元素內部的哈希?

[英]How do I store a hash which is inside an array element?

的背景

我得到了一個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;轉儲我的print Dumper \\%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]元素內部的哈希。

我想我已經為整個哈希引用概念所困擾,但是我在這里很茫然,無法想到另一種使用Google的方法。

$xchange[0]是一個哈希引用。 使用取消引用運算符%{...}將其作為哈希訪問。

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

@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來打開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

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'
        };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM