Мне кажется, что этот код .... неисправен. Поправь меня, если я ошибаюсь.
$results{$configs} = [@internalsyslogerror, @bordersyslogerror, ... ];
Это создаст только один длинный массив скалярных значений , а не массив массивов . Учтите это:
C:\perl>perl -we "@a=qw(1 2 3 a); @g=(11,22,33,44); $b{key}=[@a,@g]; print qq(@{$b{key}},\n); print qq($b{key}[0]);"
1 2 3 a 11 22 33 44,
1
Это ясно демонстрирует, что $b{key}
содержит все значения как @a
, так и @g
, и что $b{key}[0]
просто ссылается на первое значение в первом массиве, то есть $a[0]
.
Чтобы сделать то, что вы, кажется, делаете, то есть собрать журналы в отдельные переменные под определенным ключом, вам нужно использовать ссылки на массивы:
$results{$config} = [\@internalsyslogerror, \@bordersyslogerror, ...];
Единственный способ увидеть, как работает ваше текущее решение, - это если у вас в коде ранее была ошибка / функция (предназначенная или непреднамеренная), в результате чего первое значение в каждом массиве содержит все данные, относящиеся к этой категории, например:
$internalsyslogerror[0] = "device A not responding, shutting down.\ndevice A rebooted.\nyada yada\n ....";
Если это так, то то, что вы делаете, эквивалентно:
$results{$config} = [ $internalsyslogerror[0], $bordersyslogerror[0], ...];
Но если вы когда-нибудь получите два значения в одном из массивов, то ваша система будет испорчена, и в конце вашего отчета будет ошибка «по одному». Если вы не используете динамический цикл for для push
значений, но он все равно будет грязным.
Кроме того, исключая неопределенные значения, ваша внутренняя структура - которая зависит только от порядка - будет испорчена, так что вы не будете знать, происходит ли первое значение в @results
от @internalsyslogerror
или @bordersyslogerror
.
Вывод:
Если вы довольны тем, что ваша текущая система работает хорошо, просто используйте цикл for, как советуют другие. Используйте динамическое значение вместо абсолютного. Мне нравится решение FMC (слегка измененное):
# Solution by FMc
for my $k (keys %results) {
push @results, "<b>$k</b><br>";
push @results, grep { defined $results{$k}[$_] } 0 .. $#results{$k};
}
Если, однако, вы хотите сохранить внутреннюю структуру, вы не можете исключить неопределенные значения и не можете объединить все различные массивы в один, если данные уже не объединены в строки в первом значении массива. Итак:
$results{$config} = [ \@array1, \@array2, ...];
....
for my $key (keys %results) {
push @results, "<b>$key</b><br>";
my $i=0;
for my $ref (@{$results{$key}]) {
push @results, "Array $i:\n<br>" . (defined @$ref ? "@$ref" : "");
$i++;
}
}
Форматирование вывода также может быть точно настроено. Вместо объединения строк, например "@array"
, вы можете сделать явное соединение: join("<br>\n", @array)
.