arrays - 如何从 Perl 散列中删除空数组/引用?

标签 arrays perl hash

假设我有以下 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/

相关文章:

javascript - 定义替换/更改字符串的位置时出现异常字符

javascript - 如何遍历javascript对象以找到多个相似的键

php - 非法字符串偏移 'name' php - 许多数组变成 1 个数组

linux - perl grep 和 cli grep 之间的不一致

perl - 标量在 <script> 处找到运算符预期的位置

xcode - 从大小为 N 的数组中选择 K 个元素,使得子数组中的最小元素和最大元素之间的差异最小

perl - 如何使用 Plack 和 Mojolicious 避免 502 响应?

arrays - Ruby - 哈希数组到 CSV

c# - 如何将 C# 列表转换为可哈希的列表?

c# - 如何从 C# 中的字节数组生成哈希码?