在perl中,我正在尝试构建列表列表的哈希值。它看起来像这样:
my %entries;
while(<>)
{
if(/complicated regex ommitted/)
{
my @entry = ($2, $3, $4);
if(exists $entries{$1})
{
push @{$entries{$1}}, @entry;
}
else
{
$entries{$1} = @entry;
}
}
生成的哈希具有我期望的所有键,但值“列表列表”未正确构建。我做错了什么?
编辑:也许我正在尝试访问生成的哈希有什么问题。这是代码
foreach $key (keys %entries)
{
my $size = {@entries{$key}};
# just says "HASH(0xaddress)"?
print "$key: $size\n";
foreach(@{entries{$key}})
{
# loop just goes through once, prints out just " : "
print "\t$_[0]: $_[1] $_[2]\n";
}
}
答案 0 :(得分:4)
您正在推送列表,而不是listref。尝试:
push @{$entries{$1}}, \@entry;
(你不需要首先检查字段是否存在..如果它不存在,当你推动它时,它将通过自动生成的奇迹创建。)
答案 1 :(得分:4)
Perl有一项名为autovivification的功能,可以让脚手架在您需要时恢复活力。这使您的代码变得简单:
my %entries;
while(<>)
{
if (/complicated regex ommitted/)
{
my($key,@entry) = ($1, $2, $3, $4);
push @{ $entries{$key} }, \@entry;
}
}
无需检查这是否是给定密钥的第一组条目。
要转储%entries
的内容,请使用类似于
foreach my $key (sort keys %entries)
{
my $n = @{ $entries{$key} };
print "$key ($n):\n";
foreach my $l (@{ $entries{$key} })
{
print "\t$l->[0]: $l->[1] $l->[2]\n";
}
}
答案 2 :(得分:0)
您需要将引用推送到列表中,否则只会附加列表以便您获得一个简单列表(请参阅push
上的手册)。 “列表列表”始终是Perl中的“列表引用列表”。
答案 3 :(得分:0)
while ( <> ) {
if ( / (r) (e) (g) (e) x /x ) {
push @{ $entry{ $1 } }, [ $2, $3, $4 ];
}
}
或一行:
/(r)(e)(g)(e)x/ and push @{$entry{$1}}, [$2, $3, $4] while <>;
并向他们展示:
use Data::Dumper;
print Dumper \%entry;