Если вы используете Perl 5.10, вы можете сделать что-то очень похожее на то, что у вас есть сейчас, но с гораздо более приятным макетом, используя заданную / когда структуру:
use 5.010;
while (<ERR_LOG>) {
chomp;
given ($_) {
when ( m{^<parameter>: (.*)}x ) { push @parameter, $1 }
when ( m{^<result>: (.*)}x ) { push @result, $1 }
when ( m{^<stderr>: (.*)}x ) { push @stderr, $1 }
default { $stderr[-1] .= "\n$_" }
}
}
Стоит отметить, что для случая по умолчанию здесь, вместо того, чтобы хранить отдельную переменную $ err_msg, я просто нажимаю на @stderr
, когда вижу тег stderr
, и добавляю к последнему элементу * 1006. * массив, если я вижу продолжение строки. Я добавляю новую строку, когда вижу строки продолжения, так как полагаю, что вы хотите, чтобы они были сохранены.
Несмотря на то, что приведенный выше код выглядит довольно элегантно, я не на самом деле все, что любит хранить три отдельных массива, так как это, вероятно, вызовет у вас головную боль, если вещи не синхронизируются, и потому что если чтобы добавить больше полей в будущем, вы получите множество переменных, которые вам нужно будет отслеживать. Я бы предложил хранить каждую запись внутри хеша, а затем хранить массив записей:
use 5.010;
my @records;
my $prev_key;
while (<ERR_LOG>) {
chomp;
given ($_) {
when ( m{^<parameter> }x ) { push(@records, {}); continue; }
when ( m{^<(\w+)>: (.*)}x ) { $records[-1]{$1} = $2; $prev_key = $1; }
default { $records[-1]{$prev_key} .= "\n$_"; }
}
}
Здесь мы помещаем новую запись в массив, когда видим поле, добавляем запись в наш хеш всякий раз, когда мы видим пару ключ / значение, и добавляем последнее поле, к которому добавили, если видим строку продолжения , Конечный результат @records
выглядит так:
(
{
parameter => 'test_one_count',
result => 0,
stderr => qq{Expected "test_one_count=2" and the actual value is 0\ntest_one_count=0},
},
{
parameter => 'test_two_count',
result => 4,
stderr => qq{Expected "test_two_count=2" and the actual value is 4\ntest_two_count=4},
}
)
Теперь вы можете передавать только одну структуру данных, которая содержит все ваши записи, и вы можете добавить больше полей в будущем (даже многострочных), и они будут правильно обрабатываться.
Если вы не используете Perl 5.10, это может быть хорошим поводом для обновления. Если нет, вы можете перевести данные / когда структуры в более традиционные структуры if / elsif / else, но они теряют большую часть своей красоты в преобразовании.
Пол