Я потратил некоторое время на просмотр вашего кода и думаю, что понял его.
Причина, по которой трудно было ответить, заключается в том, что вы непреднамеренно посадили красную сельдь - дампер данныхoutput.
Обратите внимание, как он показывает $VAR1 = 'server1';
, а затем $VAR2 = { blah };
.
Вы назвали Dumper следующим образом: print Dumper %MyItems;
Проблема в том, что Dumper хочет списокзначений для дампа, поскольку Perl выравнивает списки, сложные структуры должны передаваться по ссылке.Итак, вам нужно вызвать Dumper следующим образом:
print Dumper \%MyItems;
Это показывает всю структуру.
Когда вы вызывали dumper ранее, вы случайно удалили один слой вашей структуры данных.Предлагаемые решения и ваш собственный код работают с этой раздетой структурой.
Здесь я привел некоторый код для обработки дополнительного уровня вложенности (и сделал его совместимым с Perl 5.8):
for my $server_items ( values %MyItems ) {
for my $record ( values %$server_items ) {
print join ';', map {
# Replace non-existant values with 'undef'
my $val = exists $record->{$_} ? $record->{$_} : 'undef';
"'$_'=>$val" # <-- this is what we print for each field
} qw( MyHost MyLogdate MyDataset backup-time backup-status );
print "\n";
}
}
Похоже, у вас много вопросов и вам нужна помощь, чтобы разобраться в ряде понятий.Я предлагаю вам опубликовать запрос на Perlmonks в Seekers of Perl Wisdom для помощи в улучшении вашего кода.SO отлично подходит для сфокусированного вопроса, но PM более поддается переработке кода.
** Оригинальный ответ: **
Чтобы обойти любые проблемы с синтаксическим анализом, которые я не могу воспроизвести, я простоустановите %MyItems
на вывод Dumper, который вы предоставили.
Ваши предупреждения, которые вы упомянули выше, имеют отношение ко всем сложным кавычкам и повторяющимся кодировкам, которые есть в вашем заявлении на печать.Я заменил ваше заявление о печати на map
, чтобы упростить код.
Святое дерьмо, большая карта соединения, бла, не проще, вы можете подумать.Но на самом деле это проще, потому что каждая отдельная единица выражения меньше.Что легче понять и понять правильно?Что проще изменить и сохранить в правильном и согласованном поместье?
print "'foo'=>$_->{foo};'bar'=>$_->{bar};boo'=>$_->{boo};'far'=>$_->{far}\n";
или
say join ';', map {
"'$_'=>$item->{$_}"
} qw( foo bar boo far );
Здесь вы можете добавлять, удалять или изменять порядок вывода, просто изменив списокаргументы переданы map
.С другим стилем у вас есть куча копий / вставок.
Карта, которую я использую ниже, немного сложнее, в том, что она проверяет, определен ли данный ключ перед печатьюзначение и назначьте значение по умолчанию, если оно отсутствует.
#!perl
use strict;
use warnings;
use feature 'say';
my %MyItems = (
'abc1.mil.mad' => {
'ERROR' => ' If you are sure is not running, please remove the file and restart ',
'MyLogdate' => 'Fri Aug 06 2010',
'MyHost' => 'server1',
'MyDataset' => 'abc1.mil.mad'
},
'abc2.cfl.mil.mad' => {
'backup-size' => '187.24 GB',
'MyLogdate' => 'Fri Aug 06 2010',
'MyHost' => 'server1',
'backup-status' => 'Backup succeeded',
'backup-time' => '01:54:27',
'MyDataset' => 'abc2.cfl.mil.mad'
},
'abc3.mil.mad' => {
'backup-size' => '46.07 GB',
'MyLogdate' => 'Fri Aug 06 2010',
'MyHost' => 'server1',
'backup-status' => 'Backup succeeded',
'backup-time' => '00:41:06',
'MyDataset' => 'abc3.mil.mad'
},
'abc4.mad_lvm' => {
'backup-size' => '422.99 GB',
'MyLogdate' => 'Fri Aug 06 2010',
'MyHost' => 'server1',
'backup-status' => 'Backup succeeded',
'backup-time' => '04:48:50',
'MyDataset' => 'abc4.mad_lvm'
}
);
for my $record ( values %MyItems ) {
say join ';', map {
my $val = $record->{$_} // 'undef'; # defined-or requires perl 5.10 or newer.
"'$_'=>$val" # <-- this is what we print for each field
} qw( MyHost MyLogdate MyDataset backup-time backup-status );
}