Использование Perl-хеша - PullRequest
2 голосов
/ 06 января 2012

Я впервые использую хеш в 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];
  }
}

1 Ответ

3 голосов
/ 06 января 2012

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

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

на

push @{$missing_files{$j}}, ${k};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...