抱歉,如果这已在其他地方解决。我搜索和搜索。
我正在使用一个配置文件,该文件通过左对齐每个块的名称和每个名称的缩进参数来分隔数据块(见__DATA__
下文)。我编写了一个脚本,将每个块存储到一个散列中,其中一个$hash{name}
键指向一个标量值,一个%hash{args}
键指向一个值数组。由于每个块都存储在自己的散列中,因此对散列的引用以匿名方式存储在数组中。最终,我想一一获取这些哈希并处理其中的值,但我在遍历数组时遇到了麻烦。
当我尝试打印存储在每个散列中的值时,它似乎是在列表上下文中获取该数组中的散列引用,因此如果 %hash{args} 是对具有三个元素的数组的引用,那是 foreach 循环的三倍运行。
我如何让该循环中的代码只为我放入该数组的每个哈希引用运行一次?
如果您检查我的输出,很明显嵌套数组引用需要被取消引用,但我一直坚持让循环正确,以至于我还无法解决这个问题。也许解决方案可以解决这两个问题?
看哪:
use strict;
use warnings;
my @array;
my %hash;
my ($name, $args);
while (my $line = <DATA>) {
chomp($line);
if ($line !~ /^\s/)
{
my ($key) = $line =~ /^\S+/g;
$hash{name} = $key;
print "Defined a name $key\n";
}
else
{
$line =~ s/^\s+//;
push (@{ $hash{args} }, $line);
print "Defined an arg $line\n";
}
push (@array, \%hash);
}
foreach my $i (@array)
{
foreach my $h (keys %{$i})
{
print $h . "\t";
print $i->{$h} . "\n";
}
}
__DATA__
Sports
Basketball
Tennis
Boxing
Guys
Tom
Dick
Harry
这是输出:
Defined a name Sports
Defined an arg Basketball
Defined an arg Tennis
Defined an arg Boxing
Defined a name Guys
Defined an arg Tom
Defined an arg Dick
Defined an arg Harry
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys