2013-10-13 3 views
0

Я пытаюсь добавить значения в массивы в хэш.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 и т. Д.

+0

Это не будет работать, поскольку вы инициализируете '$ bHash {$ b}' идентификатор транзакции, а затем пытаетесь нажать на него, как если бы это ссылка на массив. Пожалуйста, покажите форму данных ваших файлов данных и укажите, что именно вам нужно сделать. Похоже, что это относится к базе данных. – Borodin

+0

Пожалуйста, научитесь правильно форматировать свой Perl, особенно перед тем, как задать вопрос об этом. Кроме того, вы никогда не должны использовать '$ a' и' $ b' в качестве переменных общего назначения, прежде всего потому, что они вовсе не являются описательными (по той же причине вы не должны называть хэш '% bHash'), а во-вторых потому что они используются внутри Perl, и вы можете столкнуться с доступом. – Borodin

+0

добавил немного подробностей о моей конечной цели для хранения информации. – ssbsts

ответ

3

Проблема в том, что когда вы изначально устанавливаете каждое значение в %bHash, вы устанавливаете его на строковое значение, а не на массив:

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

Позже вы пытаетесь протолкнуть значение на «массив» разыменовывая его:

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

но поскольку не не массив, просто строка, Perl считает, что вы пытается разыменовать строку int o массив. (Что, я должен отметить, на самом деле потенциально правовой — если $a является строка 'foo', то @$a означает глобальную переменную @foo — но это не рекомендуется, не допускается в рамках use strict, и, очевидно, не то, что вы пытаетесь сделать .. Я упоминаю это только потому, что текст сообщения об ошибке думает, что это функция, которую вы пытаетесь использовать)

исправление просто использовать ссылку на массив, чтобы начать с:

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

так что у вас есть массив, на который вы можете безопасно вводить значения.

+0

Спасибо! Это сработало отлично, и теперь я могу добавить id и succ/fail к массиву. – ssbsts

+0

@ssbsts: Добро пожаловать! – ruakh

Смежные вопросы