【问题标题】:Issue iterating through an array of hashes and actually changing the values of the hashes in the original array问题迭代哈希数组并实际更改原始数组中的哈希值
【发布时间】:2013-03-25 14:57:58
【问题描述】:

所以,我有一个哈希数组,@doc_vector。我想遍历每个哈希并修改键的值。

我使用的原始代码如下:

my %hash=undef;

foreach my $hash (@doc_vector) {
      foreach my $key (keys %{ $hash }) {
         $hash{ $key } = log($dnum/$dfreq_hash{$key});
     }
 }

但是,当我实际引用 @doc_vector 中的哈希值时,这些值从未被修改过。 我可以通过执行以下操作来修改特定值(我保存了最后一个哈希条目的索引和我知道其值的键,分别为 $last_doc 和 $word):

foreach my $hash (@doc_vector) {
      foreach my $key (keys %{ $hash }) {
            if ($key eq $word)
         {
             $doc_vector[$last_doc]{$word}=log($dnum/$dfreq_hash{$key});                        
         }
       }
     }

效果很好,但是当我尝试对所有条目执行此操作时:

foreach my $hash (@doc_vector) {
      foreach my $key (keys %{ $hash }) {
         $doc_vector[$hash]{$key}=log($dnum/$dfreq_hash{$key});
     }
     print "I'm going infinite\n";
 }

我最终一遍又一遍地打印“我要无限”。我有一种感觉,问题是我正在输入一个哈希引用 $hash,而不是一个索引,但我不知道如何获取索引(以及我最初尝试这样做的方式(第一个代码段不起作用)。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 为什么是%hash?如果严格/警告需要它,则表明代码中存在问题...
  • my %hash = undef; 不会像您认为的那样做。它相当于my %hash = ( '' => undef );。除了第一种形式会产生带有use warnings;的警告。

标签: perl


【解决方案1】:

如果您尝试将值存储在现有散列中,则不适合创建新散列(使用 my %hash)。

Perl 在用 my %hash 隐藏它之前给你一个错误的原因是因为你正在访问一个名为 %hash 的哈希而不是 $hash 引用的哈希。

要通过引用访问散列的元素,您可以使用

$hash->{$key}

所以你的代码应该是

foreach my $hash (@doc_vector) {
   foreach my $key (keys %{ $hash }) {
      $hash->{$key} = log($dnum/$dfreq_hash{$key});
   }
}

参考文献:

【讨论】:

    【解决方案2】:

    $hash{$key} 引用哈希变量%hash 的一个元素,它与哈希引用$hash 完全不同。

    要访问哈希引用的元素,请使用解引用运算符->

    $hash->{$key} = log($dnum/$dfreq_hash{$key});
    

    【讨论】:

      【解决方案3】:

      这有帮助吗?我认为你不应该引入my %hash = undef;,因为 Perl 试图告诉你一些问题。

      #!/usr/bin/env perl
      use strict;
      use warnings;
      
      my @doc_vector = ( { key1 => 12, key2 => 14 }, { key3 => 17, key4 => 23 } );
      
      sub dump_doc
      {
          my($tag, @doc) = @_;
          print "$tag:\n";
          foreach my $hash (@doc)
          {
              foreach my $key (keys %{$hash})
              {
                  print "$key: $hash->{$key}\n";
              }
          }
      }
      
      dump_doc("Before", @doc_vector);
      
      print "Fixing:\n";
      foreach my $hash (@doc_vector)
      {
          foreach my $key (keys %{$hash})
          {
              print "$key: $hash->{$key}\n";
              $hash->{$key} = log($hash->{$key});
          }
      }
      
      dump_doc("After", @doc_vector);
      

      输出:

      Before:
      key2: 14
      key1: 12
      key4: 23
      key3: 17
      Fixing:
      key2: 14
      key1: 12
      key4: 23
      key3: 17
      After:
      key2: 2.63905732961526
      key1: 2.484906649788
      key4: 3.13549421592915
      key3: 2.83321334405622
      

      【讨论】:

        猜你喜欢
        • 2014-12-15
        • 2017-05-11
        • 2015-11-08
        • 2019-06-03
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多