【问题标题】:How do I store a hash which is inside an array element?如何存储数组元素内的哈希?
【发布时间】:2013-10-27 09:55:26
【问题描述】:

背景

我有一个 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; 转储我的测试哈希输出与上面的数组元素相同

$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] 元素内的哈希。

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

【问题讨论】:

    标签: arrays perl hash hashmap


    【解决方案1】:

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

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

    【讨论】:

    • 是不是叫做“解引用运算符”?我一直把它们称为“支持花括号”。
    • % 是解引用运算符(perldsc 称其为“前缀解引用器”);大括号是为了优先。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      @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
      

      【讨论】:

      • 一个肯定不是“很多”。我喜欢%$href 的简洁性,我觉得它很好地展示了正在发生的事情。
      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多