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を入れていることだと感じていますが、インデックスを取得する方法(および最初にこれを実行しようとした方法(1回目)がわかりません。コードセグメントが機能しませんでした)。

どんな助けでも大歓迎です。

前もって感謝します。

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

$hash{$key}%hashハッシュ参照とは完全に異なる変数であるハッシュ変数の要素を参照し$hashます。

ハッシュ参照の要素にアクセスするには、間接参照演算子を使用します->

$hash->{$key} = log($dnum/$dfreq_hash{$key});
于 2013-03-25T06:47:52.763 に答える
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 に答える