迭代遍历散列数组并实际更改原始数组中散列值的问题

时间:2013-03-25 06:41:14

标签: perl

所以,我有一个哈希数组,@ 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而不是索引,但我不知道如何获取索引(以及我最初尝试这样做的方式(第1次)代码段不起作用。)

非常感谢任何帮助。

提前致谢。

3 个答案:

答案 0 :(得分:2)

如果您尝试将值存储在现有哈希中,则创建新哈希(使用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});
   }
}

参考文献:

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

这有帮助吗?我认为你不应该引入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