2012-01-06 2 views
2

Это первый раз, когда я использовал хэш в 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]; 
    } 
} 
+0

Поскольку 'missing_files' относится к хэш, вы должны заменить' $ missing_files [$ J} '' с $ missing_files {$ J} ' , –

+0

Это не скомпилируется, потому что у вас есть $ missing_files [$ j} = $ {k}; - Вы можете исправить это, так что это правильно? –

+0

О, это опечатка, исправлена. Но я думаю, @Borodin ответил на вопрос ниже, каждый. –

ответ

3

Значения хэша Perl могут содержать только один скаляр. Если вы хотите сохранить список вещей, тогда вы должны сделать эту скалярную ссылку на массив. Чтобы сделать это, измените строку

$missing_files{$j} = ${k}; 

в

push @{$missing_files{$j}}, ${k}; 
+0

Thx для ответа, но как распечатать ссылку? прямо сейчас он печатает только ARRAY (0xd974bf0) (это ссылка появляется в perl?) в моей заявке на печать. –

+2

@ dazhuangcao: Используйте 'print '@ {$ array_ref}" ' – choroba

+1

' print' $ _ \ n "foreach @ {$ missing_files {$ j}};' – Borodin

Смежные вопросы