【问题标题】:How to append new values to hash in Perl如何在 Perl 中将新值附加到散列
【发布时间】:2014-06-16 14:54:18
【问题描述】:

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

这是我到目前为止的目标:

#!/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])我希望这个值被附加而不是更新了。

因此,理想情况下,对于以下(制表符分隔)列表:

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'}
}

【问题讨论】:

    标签: perl hash hash-of-hashes


    【解决方案1】:

    你可以附加你的字符串,

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-23
      • 2015-07-17
      • 2013-11-14
      • 2012-02-20
      • 2011-04-16
      • 2016-05-06
      • 1970-01-01
      • 2015-05-24
      • 2011-08-15
      相关资源
      最近更新 更多