【发布时间】:2012-08-16 06:55:15
【问题描述】:
如果此问题已在其他地方得到解决,我们深表歉意。我找了又找。
我正在使用一个配置文件,该文件通过左对齐每个块的名称和每个名称的缩进参数来分隔数据块(参见下面的__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
【问题讨论】:
标签: arrays perl hash hash-of-hashes