ハッシュの配列に値を追加しようとしています。
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
ステートメントはそれをチェックし、%bHash
b->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 などが必要です。