我已经花了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";
}
但显然这不是解决方案:(
任何帮助?
答案 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";
}