Я пытаюсь добавить значения в массивы в хэш.Perl: Добавление в массив хэша
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;
}
Я связывающие два файла журнал вместе на основе коды транзакции и-х идентификатор транзакции Б, которые оба найдены на одной строке журнала в журнале Б.
Оператор if
проверяет это и заполняет %bHash
идентификатором b-> ID = a->.
Затем я ищу либо успех, либо неудачу транзакции b. Если я вижу строку успеха, я беру идентификатор транзакции, и если этот идентификатор существует в %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.
Есть ли способ сделать это?
Я также хочу продолжать добавлять информацию в массив, если это возможно, когда я просматриваю журнал для получения дополнительных данных. Я хочу использовать идентификатор транзакции в качестве ключа и просто добавлять информацию по мере необходимости. Это возможно? Есть ли лучший способ выполнить задачу?
Редактировать: То, что я пытаюсь выполнить, состоит в том, чтобы скомпилировать информацию о транзакции через 3 разных файла журнала. Я хочу найти следующее для каждой транзакции: Success of Fail, If failed, где это произошло, в log a, b или c?
Одна транзакция обрабатывается 3 различными приложениями, поэтому 3 разных журнала. К сожалению, идентификатор trans id отличается от приложения a vs apps b и c. Таким образом, я построил хэш со всеми трансформаторами в журнале a, а затем в журнале b есть строка журнала, которая позволяет вам видеть связь между идентификатором передачи, используемым для журнала a и trans id, используемым для журнала b. Вот почему я сопоставляю trans id с b с хешем из журнала a. В конечном счете, я хочу, чтобы информация для каждого transId была упомянута выше, sucs/fail и т. Д.
Это не будет работать, поскольку вы инициализируете '$ bHash {$ b}' идентификатор транзакции, а затем пытаетесь нажать на него, как если бы это ссылка на массив. Пожалуйста, покажите форму данных ваших файлов данных и укажите, что именно вам нужно сделать. Похоже, что это относится к базе данных. – Borodin
Пожалуйста, научитесь правильно форматировать свой Perl, особенно перед тем, как задать вопрос об этом. Кроме того, вы никогда не должны использовать '$ a' и' $ b' в качестве переменных общего назначения, прежде всего потому, что они вовсе не являются описательными (по той же причине вы не должны называть хэш '% bHash'), а во-вторых потому что они используются внутри Perl, и вы можете столкнуться с доступом. – Borodin
добавил немного подробностей о моей конечной цели для хранения информации. – ssbsts