0

ハッシュの配列に値を追加しようとしています。

foreach my $f (@files) {
  my $file = "$logDir/$f";
  open my $info, $file or die "Could not open $file: $!";
  while (my $line = <$info>) {
    chomp $line;
    if ($line =~ /CONN.*\[ID=(.*)\].*ID is(.*)/) {
      $b = $1;
      $a = $2;
      $a =~ s/^\s+//;
      $bHash{$b} = $a if (exists $aHash{$a});
    }
    elsif ($line =~ /succ.*\[ID=(.*)\].*/) {
      $b = $1;
      push(@{ $bHash{$b} }, "bSUCC") if (exists $bHash{$b});
    }
    elsif ($line =~ /fail.*\[ID=(.*)\].*/) {
      $b = $1;
      push(@{ $bHash{$b} }, "bFAIL") if (exists $bHash{$b});
    }
  }
  close $info;
}

a のトランザクション ID と b のトランザクション ID に基づいて 2 つのログ ファイルをリンクしています。これらは両方とも b のログの 1 つのログ行にあります。

最初のifステートメントはそれをチェックし、%bHashb->ID = a->Id を入力します。

次に、b のトランザクションの成功または失敗を探しています。成功行が表示された場合は、トランザクション ID を取得します。その ID が存在する場合は%bHash、「bSucc」メッセージを配列の最後にプッシュします。つまり%bHash、bSid -> aSid、bSucc になります。

次のエラー/警告メッセージが表示されます。

Can't use string ("7747395") as an ARRAY ref while "strict refs" in use at ./report.pl line 54, <$info> line 833.

これを行う方法はありますか?

また、ログをスキャンしてさらにデータを取得しながら、可能であればアレイに情報を追加し続けたいと考えています。トランザクション ID をキーとして使用し、必要に応じて情報を追加したいだけです。これは可能ですか?タスクを達成するためのより良い方法はありますか?

編集: 私が達成しようとしているのは、トランザクションに関する情報を 3 つの異なるログ ファイルにまとめることです。トランザクションごとに次の情報を見つけたい: 失敗の成功、失敗した場合、ログ a、b、または c のどこで失敗したか?

1 つのトランザクションが 3 つの異なるアプリによって処理されるため、3 つの異なるログが作成されます。残念ながら、アプリ a とアプリ b および c では、trans id が異なります。そのため、ログ a のすべてのトランザクション ID を使用してハッシュを作成すると、ログ b にログ行があり、ログ a に使用されるトランザクション ID とログ b に使用されるトランザクション ID の間のリンクを確認できます。そのため、b のトランザクション ID をログ a のハッシュと照合しています。最終的には、上記のように各 transId の情報、sucs/fail などが必要です。

4

1 に答える 1

3

問題は、最初に各値を に設定するとき%bHashに、配列参照ではなく文字列値に設定していることです。

      $bHash{$b} = $a if (exists $aHash{$a});

後で、逆参照して値を「配列」にプッシュしようとしています。

      push(@{ $bHash{$b} }, "bSUCC") if (exists $bHash{$b});

しかし、配列なく文字列だけなので、Perl は文字列を配列に逆参照しようとしていると判断します。(これは、実際には合法である可能性があることに注意してください —$aが stringの場合、グローバル変数を意味します— しかし、'foo'それは推奨されておらず、 のスコープでは許可されておらず、明らかにあなたがやろうとしていることではありません。私はそれについてのみ言及しますエラー メッセージのテキストは、それが使用しようとしている機能であると考えているためです。)@$a@foouse strict

修正は、最初に arrayref を使用するだけです。

      $bHash{$b} = [$a] if (exists $aHash{$a});

値を安全にプッシュできる配列が得られるようにします。

于 2013-10-13T22:49:01.307 に答える