1

いくつかのキーをハッシュに追加する、つまりサブルーチンでの変更に問題があります。これが私のサブルーチン呼び出しです:

getMissingItems($filename, \%myItems); #myItems is already defined above this

サブルーチン自体:

sub getMissingItems {
    my $filename = shift;
    my $itemHash = shift;

    #... some stuff

    foreach $item (@someItems) {

        if (not exists $itemHash{$item}) {
            %$itemHash{$item} = 0; 
        }

    }

}

「グローバル シンボル %itemHash には明示的なパッケージ名が必要です」というエラーが表示されます

これを適切に行うにはどうすればよいですか?ありがとう。

編集 - この最初のハードルを超えて、みんなに感謝します。「「厳密な参照」が使用されている間は、文字列 (「0」) を HASH 参照として使用できません」というメッセージが表示されます。不足しているキー エントリをゼロに設定したいだけです

4

5 に答える 5

3

hashref の要素にアクセスするための正しい構文を使用していません。

$itemhash->{$item}or$$itemhash{$item}を最も内側のループで試してください。

于 2012-10-05T21:42:54.403 に答える
1

%itemHashサブのスコープにはありませんが、その名前の変数を使用しようとしています。

が参照するハッシュにアクセスするつもりな$itemHashので、

if (not exists $itemHash{$item}) {
    %$itemHash{$item} = 0; 
}

する必要があります

if (not exists $itemHash->{$item}) {
    $itemHash->{$item} = 0; 
}

ところで、あなたはそれを次のように単純化することができます

$itemHash->{$item} //= 0; 

(これは、要素が であるかどうかをチェックします。それはではdefinedありませんexistsが、この場合はおそらく同じことです。)

于 2012-10-05T21:43:09.700 に答える
1

ハッシュ参照の値にアクセスするには、矢印逆参照演算子を使用します。

if (not exists $itemHash->{$item}) {
    $itemHash->{$item} = 0;
}
于 2012-10-05T21:43:41.443 に答える
1

あなたのコードには $itemHash{$item} があり、$itemHash->{$item} のはずです。以下のコードは、エラーのある行を指しています。

sub getMissingItems {
    my $filename = shift;
    my $itemHash = shift;

    foreach $item (@someItems) {

        if (not exists $itemHash{$item}) { # <--- this is wrong
            %$itemHash{$item} = 0; # <--- this one too
        }

    }
}
于 2012-10-05T21:45:27.700 に答える
1

%$itemHash{$item} = 0;$itemHash->{$item} = 0;. あなたが持っているバージョンは、何か違う(そして間違っている)ことをしようとしています。参照のもつれを解くには、 Perl References Tutorialを読むことをお勧めします。

于 2012-10-05T21:43:53.453 に答える