所以,我有一个哈希数组,@ 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次)代码段不起作用。)
非常感谢任何帮助。
提前致谢。
答案 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