1

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

任何帮助将非常感激。

提前致谢。

4

3 回答 3

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

参考文献:

于 2013-03-25T06:56:04.023 回答
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
于 2013-03-25T06:57:58.340 回答
1

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

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

$hash->{$key} = log($dnum/$dfreq_hash{$key});
于 2013-03-25T06:47:52.763 回答