2013-03-25 39 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