2011-12-23 159 views
1

的哈希我有以下代码如何创建哈希键

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

输出请帮助。

+0

这是一个后续以前http://stackoverflow.com/questions/8613452/how-to-create-hash -with-duplicate-keys – daxim 2011-12-23 10:55:33

+0

Nitech,请注意,您只能接受一个答案。 – TLP 2011-12-23 11:02:11

+0

@daxim:是的后续行动。实际上从过去2小时我试图这个,并没有得到。我几乎感到沮丧。我修改了我的最后一个问题,没有人回复。这就是为什么我提出了一个新的问题。 – Nitesh 2011-12-23 11:10:47

回答

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

好吧,它与你有什么不同。只是一个哈希分配更换push(谢谢你自动vivification):

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

此外,我已经重新安排了“分裂”,因此,它的每行只调用一次。

+0

感谢您的代码。它的工作。但我没有得到它的工作。因为有重复的钥匙。 – Nitesh 2011-12-23 11:02:26