if ($reftype eq 'REF' || $reftype eq 'SCALAR') { clean($$node); $node = undef if !defined($$node); } els #### sub clean { our $node; local *node = \$_[0]; # Alias return if !defined($node); my $reftype = ref($node); return if !$reftype; if ($reftype eq 'ARRAY') { clean($_) for @$node; @$node = grep defined, @$node; $node = undef if !@$node; } elsif ($reftype eq 'HASH') { clean($_) for values(%$node); delete @{$node}{ grep !defined($node->{$_}), keys(%$node) }; $node = undef if !keys(%$node); } } #### [[[],[],["b"]],"a"] [[["b"]],"a"] [[[],[],[]],"a"] ["a"] #### my $n = scalar(keys %$ref); if ($n == 0) { return 0; } return 1; #### return keys(%$ref) ? 1 : 0; #### return keys(%$ref);