使用Perl枚举哈希数组

时间:2014-08-14 13:06:18

标签: arrays perl hash

我已经花了2小时尝试了涉及哈希和数组的不同解决方案,但我没有找到如何遍历我的哈希数组:

我创建了一个这样的数组:

my @matches;
push @matches, {file => $1, function => $2} while m/KEY_FILE \s* \{ [^\}]+ KEY_SECTION \s* \( \s* ([^()]+) \( ([^()]+) \) \s* \)/ixg;
my $count = @matches;

我想做这样的事情:

while (($file, $function) = shift(@matches)) {
    print "// File:     $file\n";
    print "// Function: $function\n";
}      

但显然这不是解决方案:(

任何帮助?

3 个答案:

答案 0 :(得分:3)

我宁愿选择简单的foreach,

for my $href (@matches) {
  my ($file, $function) = @$href{qw(file function)};
}

答案 1 :(得分:3)

    foreach my $match ( @matches ) {
         print "// File: $match->{file}\n";
         print "// Function: $match->{function}\n";
    }

答案 2 :(得分:3)

请注意,在声明语句这么长时使用后缀while语句修饰符)是不合适的。这一点远非一目了然:

push @matches, {file => $1, function => $2} while m/KEY_FILE \s* \{ [^\}]+ KEY_SECTION \s* \( \s* ([^()]+) \( ([^()]+) \) \s* \)/ixg;

由于正则表达式的长度,即使标准while也很笨拙。

while (/KEY_FILE \s* \{ [^\}]+ KEY_SECTION \s* \( \s* ([^()]+) \( ([^()]+) \) \s* \)/ixg ) {
  push @matches, { file => $1, function => $2 };
}

将正则表达式的功能分开并将其放入自己的变量中要好得多:

my $re = qr{
    KEY_FILE \s*
    \{ [^\}]+ KEY_SECTION \s*
    \( \s*
      ( [^()]+ )
      \( ( [^()]+ ) \) \s*
    \)
}xi;

while ( /$re/g ) {
  push @matches, { file => $1, function => $2 };
}

除此之外,一旦构建了@matches数组,最简单的是迭代其值,即哈希引用。然后,您可以使用哈希切片提取每个值对。喜欢这个

for my $href (@matches) {
   my ($file, $function) = @{$href}{qw/ file function /};
   print "// File:     $file\n";
   print "// Function: $function\n";
}

或者,如果仅访问两个值

,则可以继续使用哈希引用
for my $href (@matches) {
   print "// File:     $href->{file}\n";
   print "// Function: $href->{function}\n";
}