如何在Perl中将新值附加到哈希值

时间:2014-04-30 10:18:56

标签: perl hash hash-of-hashes

我有哈希哈希,在最后一级,我想要附加每个值 - 未更新 - 如果该值已经存在。最好的方法是什么?我正在考虑将值作为列表,但这可能不是最有效的方式......

这是我到目前为止所处的位置:

#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $dir='D:\';

open my $data,"<","$dir\\file.txt";

my (@selecteddata,@array,%hash);

while (<$data>) {
    chomp $_;
    my @line= split "\t";

    $hash{$line[1]}{$line[2]}=$line[0]; 
    warn Dumper \%hash;
}
close $data;

注意,此代码使用值$line[0]更新最后一级的值,但如果密钥$line[4]已存在(意味着,它已具有先前值$line[0]),我希望这样值被追加而不是更新。

理想情况下,对于以下(tab sepparated)列表:

a1  b1  c1
a2  b2  c2
a3  b3  c3
a4  b4  c4
a5  b4  c4

哈希看起来像这样 - 我不确切地知道a4a5的分组应该是什么样子,所以只要它们被分组就应该没问题:

{
    'b1'    =>  {'c1'   =>  'a1'},
    'b2'    =>  {'c2'   =>  'a2'},
    'b3'    =>  {'c3'   =>  'a3'},
    'b4'    =>  {'c4'   =>  'a4, a5'}
}

1 个答案:

答案 0 :(得分:4)

你可以追加你的字符串,

$_ = defined($_) ? "$_, $line[0]" : $line[0] 
  for $hash{$line[1]}{$line[2]};

或使用更适合存储元素列表的数组

push @{ $hash{$line[1]}{$line[2]} }, $line[0];