如何创建哈希键
问题描述:
的哈希我有以下代码如何创建哈希键
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'
}
};
输出请帮助。
答
如果需要散列作为输出,则需要使用散列。
无需分割三次并使用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;
答
好吧,它与你有什么不同。只是一个哈希分配更换push
(谢谢你自动vivification):
foreach (@a)
{
my ($e, $d, $c) = split;
$hash->{$c}->{$d} = $e;
}
此外,我已经重新安排了“分裂”,因此,它的每行只调用一次。
+0
感谢您的代码。它的工作。但我没有得到它的工作。因为有重复的钥匙。 – Nitesh 2011-12-23 11:02:26
这是一个后续以前http://*.com/questions/8613452/how-to-create-hash -with-duplicate-keys – daxim 2011-12-23 10:55:33
Nitech,请注意,您只能接受一个答案。 – TLP 2011-12-23 11:02:11
@daxim:是的后续行动。实际上从过去2小时我试图这个,并没有得到。我几乎感到沮丧。我修改了我的最后一个问题,没有人回复。这就是为什么我提出了一个新的问题。 – Nitesh 2011-12-23 11:10:47