使用Perl哈希

时间:2012-01-06 17:34:56

标签: perl hash

这是我第一次在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];
  }
}

1 个答案:

答案 0 :(得分:3)

Perl哈希值只能包含一个标量。如果要存储事物列表,则必须使该标量成为数组引用。为此,请更改行

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

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