创建哈希字符串=>列表清单,我做错了什么?

时间:2010-06-28 18:16:03

标签: perl

在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";
    }
}   

4 个答案:

答案 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;