5

以下に示すように、メッセージの種類に応じて、ログ メッセージをハッシュに保存しようとしています。

#!/usr/bin/perl

use strict;
use warnings;

my %log;

opendir (DIR, '.') or die $!;
while (my $file = readdir(DIR)) {
    # some code to select TAR filename in $1
    if (-e $1.'.tar') {
        push(@{$log->{$1}}, $file); /* line 12 */
    }
    else {
        $log{$1} = [];
        push(@{$log->{$1}}, $file); /* line 16 */
}

今、このコードは次のようなコンパイルエラーを出します:

Global symbol "$log" requires explicit package name at at lines 12 & 16

実際にハッシュ「%log」を使用しようとしています。このエラーを取り除くにはどうすればよいでしょうか? なぜこれが起こっているのですか?

変数があるコンテキストで作成され、別のコンテキストで参照されていると人々が答えたコンテキストに関する説明を見ましたが、この変数はこのコードの while ループ内で使用できるはずだと思います。これは、「use strict」を使用している場合にのみ発生し、それ以外の場合は正常に動作します。

Perl を始めたので、基本がよくわかりません。この変数にアクセスできない理由を理解してください。

4

2 に答える 2

10
my %log;

hash%logを定義していますが、12 行目と 16 行目では使用していません。$log代わりに、宣言したことのないスカラーによって参照される匿名ハッシュにアクセスしています。2 つのオプションがあります。

  • 引き続き匿名ハッシュを使用できます。

    my $log = {};   # The creation of the hash ("{}") is currently being done
                    # implicitly by "->". This is called autovivification.
    
    
    ... $log->{...} ...
    

    これにより、少し複雑さが増し、速度が著しく低下します。

  • ハッシュを直接使用できます。

    my %log;
    
    ... $log{...} ...
    
于 2013-05-01T17:14:25.510 に答える