Это первый раз, когда я использовал хэш в Perl, и я застрял в странной проблеме. То, что я пытаюсь сделать, это после того, как я создаю резервные копии файлов в каталоге, я использую программу 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» только хранит последний недостающий файл в каждой директории. Логика кажется простой, так что мне здесь не хватает?
Редактировать: Я использовал совет от @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];
}
}
Поскольку 'missing_files' относится к хэш, вы должны заменить' $ missing_files [$ J} '' с $ missing_files {$ J} ' , –
Это не скомпилируется, потому что у вас есть $ missing_files [$ j} = $ {k}; - Вы можете исправить это, так что это правильно? –
О, это опечатка, исправлена. Но я думаю, @Borodin ответил на вопрос ниже, каждый. –