2013-03-25 51 views
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和$字):這工作得很好

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

我結束了印刷「我要無限」一遍又一遍。我有一個感覺,問題是我把一個哈希引用,$哈希,而不是索引,但我不知道如何獲得索引(以及我最初試圖做到這一點的方式(1st代碼段沒有提前工作)。

任何幫助,將不勝感激。

感謝。

+2

爲什麼'%hash'?如果嚴格/警告需要它,這是一個進一步代碼下面的問題的跡象...... – 2013-03-25 06:50:08

+0

'my%hash = undef;'不會做你認爲它的做法。它相當於'my%hash =(''=> undef);'。除了第一種形式會產生帶有「使用警告」的警告。 – 2013-03-25 17:23:42

回答

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

文檔:

+0

非常感謝大家。 – 2013-03-25 07:22:06

1

$hash{$key}指散列變量%hash的元件,這比完全不同的可變哈希引用$hash

要訪問哈希引用的元素,請使用t他引用操作->

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

這是否幫助?我認爲你不應該像Perl試圖告訴你一些問題那樣引入my %hash = undef;

#!/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