假设我有以下 Perl 哈希:
%hash = (
'A' => {
'B' => ['C', 'D', 'E'],
'F' => { 'G' => [], 'H' => [] },
'I' => []
} );
我想去掉 []
以获得下面的哈希结果:
%hash = (
'A' => [
'B' => ['C', 'D', 'E'],
'F' => [ 'G', 'H', 'I' ]
]
)
(我希望我的 {}
和 []
是平衡的,如果没有,我深表歉意,但是)基本上我想这样做,这样就没有空数组/ref 存在。我确信这是可能的/简单的,但我不确定 delete()
是否有效,或者是否有更好的方法或 Perl 模块。有人可以引导我朝着正确的方向前进吗?
最佳答案
看起来您的数据可能是任意嵌套的,您想要递归地遍历它,将某些模式重写为其他模式。为此,我将使用 Data::Visitor
。
use Data::Visitor::Callback;
use List::MoreUtils 'all';
my $visitor = Data::Visitor::Callback->new(
hash => sub {
my ($self, $href) = @_;
# fold hashrefs with only empty arrayrefs as values into arrayrefs
if (all { ref $_ eq 'ARRAY' && !@{ $_ } } values %{ $href }) {
return [ keys %{ $href } ];
}
# strip k/v pairs with an empty arrayref as a value
return {
map {
$_ => $href->{$_}
} grep {
ref $href->{$_} ne 'ARRAY' || @{ $href->{$_} }
} keys %{ $href }
};
},
);
my %new_hash = %{ $visitor->visit(\%hash) };
这只是说明了我将使用的基本方法,并且恰好适用于您提供的示例输入。它可能需要进行各种调整,具体取决于您想在其他评论中指出的极端情况下执行的操作。
关于arrays - 如何从 Perl 散列中删除空数组/引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3791014/