如何创建哈希键的哈希值

时间:2011-12-23 10:34:16

标签: perl hash

我有以下代码

use strict;
use warnings;
use Data::Dumper;

my $s = "12   A    P1  
23   B    P5
24   C    P2
15   D    P1
06   E    P5 ";
my $hash = {};
my @a  = split(/\n/, $s);

foreach (@a)
{
  my $c = (split)[2];
  my $d = (split)[1];
  my $e = (split)[0];
  push(@{$hash->{$c}}, $d);
}
print Dumper($hash );

我正在获取输出

    $VAR1 = {
   'P5' => [
             'B',
             'E'
           ],
   'P2' => [
             'C'
           ],
   'P1' => [
             'A',
             'D'
           ]
    };

但我希望输出像

 $VAR1 = {
'P5' => {
 'E' => '06',
 'B' => '23'
  },
 'P2' => {
   'C' => '24'
 },
 'P1' => {
   'A' => '12',
   'D' => '15'
 }
  };

请帮忙。

2 个答案:

答案 0 :(得分:3)

如果您希望将哈希作为输出,则需要使用哈希。

无需拆分三次并使用postscripts,只需拆分一次并分配所有变量。也不需要将标量初始化为空哈希,perl将为您处理。

我重命名了变量以提高可读性。

my $string = "12   A    P1  
23   B    P5
24   C    P2
15   D    P1
06   E    P5 ";
my $hash;
my @lines = split(/\n/, $string);

foreach (@lines)
{
    my ($value, $key2, $key) = split;
    $hash->{$key}{$key2} = $value;
}
print Dumper($hash );

请注意,如果您有多个具有相同键的值,它们将相互覆盖。在这种情况下,您需要将值推送到数组上:

push @{$hash->{$key}{$key2}}, $value;

答案 1 :(得分:1)

嗯,这与你所拥有的并没有什么不同。只需用散列分配替换push(谢谢你自动生成):

foreach (@a)
{
    my ($e, $d, $c) = split;
    $hash->{$c}->{$d} = $e;
}

此外,我已经重新安排了“拆分”,以便每行只调用一次。