Я впервые использую хеш в Perl, и я застрял в странной проблеме. То, что я пытаюсь сделать, это после того, как я создаю резервную копию файлов в каталоге, я использую программу Perl, чтобы проверить, все ли файлы появляются в файле журнала. Итак, у меня был следующий код:
our (%missing_files) = (); # global definition on the top of the program
... do something ...
sub CheckTarResult {
my (@dir_list) = (); # dir list
my (@file_list) = (); # will be filled with all file names in one dir
my ($j) = "";
my ($k) = ""; # loop variable
my ($errors) = 0; # number of missing files
... do something ...
foreach $j (@dir_list) {
@file_list = `ls $j`;
foreach $k (@file_list) {
$result = `cat $logfile | grep $k`;
if ($result eq "") {
$errors++;
$missing_files{$j} = ${k};
}
}
@file_list = ();
}
... do something ...
my($dir) = "";
my($file) = "";
while ( ($dir, $file) = each(%missing_files) ) {
print $dir . " : " . $file;
}
Я сделал пустой файл журнала, чтобы выполнить тест, ожидаемый результат должен дать мне все отсутствующие файлы, но каким-то образом «missing_files» сохраняет только последний отсутствующий файл в каждом каталоге. Логика кажется простой, так чего мне здесь не хватает?
Edit:
Я использовал совет от @Borodin, и это сработало. Но чтобы напечатать содержимое ссылки на массив, нам нужно перебрать элементы в массиве. Код после изменения выглядит следующим образом:
... everything before is the same ...
push @{$missing_files{$j}}, ${k}; # put elements in dictionary
# in the print statement
while( ($dir, $file) = each(%missing_files) ) {
for $i ( 0 .. $#$file ) { # $#$file represents the array size by reference
print $dir . " : " . ${$file}[i];
}
}