【发布时间】:2014-07-28 10:00:00
【问题描述】:
我有一个字符串我想“unflatten”或“tree-ify”;也就是说,我想从这个出发:
F=8|A_C=3|A_B=2|D_G_H=11|D_B=2|E=5
到这里:
{
A => {
B => 2,
C => 3,
},
D => {
B => 2,
G => {
H => 11,
},
},
E => 5,
F => 8,
}
我的策略是分别处理每个以竖线分隔的字段,并通过= 符号拆分为键/值对:
sub unflatten {
my ($data) = @_;
my @fields = split /\|/, $data;
my $result = {};
for my $datum (@fields) {
my ($key, $value) = split /=/, $datum;
$result->{&processline($key)} = $value;
}
return $result;
}
我在 processline 函数中尝试了一些递归魔法:
sub processline {
my ($key) = @_;
my ($first, $rest) = split /_/, $key, 2; # split key into at most 2 parts
if($rest) {
return { $first => &processline($rest) };
# if the key is nested, there will be something in $rest
# so recursively process the smaller $rest, and build up the result hashref
}
else {
return $first;
}
}
很遗憾,这不起作用:
my $header = "F=8|A_C=3|A_B=2|D_G_H=11|D_B=2|E=5";
use Data::Dumper;
print Dumper &unflatten($header);
当我这样做时,我得到:
$VAR1 = {
'F' => '8',
'HASH(0xe9af60)' => '2',
'HASH(0xe9ae28)' => '11',
'E' => '5',
'HASH(0xe9af90)' => '3',
'HASH(0xe9ae40)' => '2'
};
有人可以解释递归解决方案背后的思考过程,或者建议我的 Perl 哪里出了这么大的问题吗?令人沮丧的是,我能够很容易地想出这个函数的逆函数(展平)。
【问题讨论】:
-
您从 processline 返回的密钥不正确,请参见:ideone.com/28apW3
-
附带说明,您的
&sub()呼叫中的&是不需要的。它告诉 Perl 忽略原型设计,而你没有。你可以安全地放下它。有关详细信息,请参阅stackoverflow.com/questions/1347396/…。