-1

より高いスコープで変数を宣言したにもかかわらず、それを使用しようとすると、明示的なパッケージ名が必要であると言われます。コードは次のとおりです。

my $stats = {
    privileges => (),
    missing_users => ()
};

LINE:
while (my $line = <$fh>)
{
    chomp($line);
    next if $line eq "";

    my $regex = "";
    my $type = "";

    while (($type, $regex) = each(%$entry_regex))
    {
        if ($line =~ /$regex/) {
            if ($type eq "EXCEPTION_PRIVS")
44:         {
45:             push(@{$stats{privileges}}, $1);
46:             next LINE;
            }

私が得るエラーは次のとおりです。

グローバル シンボル "%stats" には、Import Routine Log Pars er.pl 行 45 で明示的なパッケージ名が必要です。

このエラーは発生しませんuse strict;。削除すると、スクリプトは必要に応じて実行されます。

「より高い」スコープで宣言したので、ループ内のコードにアクセスできるはずだと思いました。このエラーが発生するのはなぜですか?

4

3 に答える 3

2

あなたのpush発言はここで間違っています

push(@{$stats{priveleges}}, $1);

my $stats次のように宣言したいと思います。

my $stats = {
    foo => [],
    bar => [],
}

次に、この配列参照にプッシュできます。

push @{ $stat->{foo} }, $1;
于 2013-04-30T17:57:29.217 に答える
0

エラー メッセージが示すように、$stats{privileges}は というハッシュを検索しようとして%statsいますが、 にハッシュ参照があり$statsます。45行目でこれを試してください:

push(@{$stats->{privileges}}, $1);

他のすべての問題を修正したので、うまくいくはずです。

于 2013-05-01T11:46:10.707 に答える