如何从Perl哈希中删除空数组/引用?

Nic*_*ick 2 arrays perl hash

可以说我有以下Perl哈希:

%hash = ( 
    'A' => { 
        'B' => ['C', 'D', 'E'], 
        'F' => { 'G' => [], 'H' => [] }, 
        'I' => [] 
        } );
Run Code Online (Sandbox Code Playgroud)

我想摆脱[]下面的哈希结果:

%hash = ( 
    'A' => [ 
       'B' => ['C', 'D', 'E'], 
       'F' => [ 'G', 'H', 'I' ] 
        ] 
    )
Run Code Online (Sandbox Code Playgroud)

(我希望我得到了我{}[]平衡的,我道歉,如果没有,但)基本上我想要让这个没有空的阵列/ REF的存在.我确信这是可行的/简单的,但我不确定是否delete()可行,或者是否有更好的方法或Perl模块.有人能引导我朝着正确的方向前进吗?

raf*_*afl 5

看起来您的数据可能是任意嵌套的,并且您希望以递归方式遍历它,将某些模式重写为其他模式.为此,我会使用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) };
Run Code Online (Sandbox Code Playgroud)

这只是说明了我使用的基本方法,并恰好适用于您提供的示例输入.它可能需要进行各种调整,具体取决于您在其他注释中指出的角落中要执行的操作.