我有以下代码
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 :(得分: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;
}
此外,我已经重新安排了“拆分”,以便每行只调用一次。