Perl中将含undef的多维数组转为一维数组是否有更简便实现?
Perl扁平化数组并过滤undef的简化实现
你的需求是对输入数组做两层处理:先过滤undef值,再把一层嵌套的数组合并为一维数组,可直接用grep+map的链式写法替代显式循环,省略中间变量,代码更简洁:
use Data::Dumper; my $input = [undef, [0, 1], 2]; # 先过滤undef,再展开第一层数组引用 my @result = map { ref $_ eq 'ARRAY' ? @$_ : $_ } grep { defined } @$input; print Dumper \@result;
运行后输出和你原有代码完全一致:
$VAR1 = [ 0, 1, 2 ];
如果你需要支持任意深度的嵌套数组扁平化,也可以用递归的map写法,不用额外引入CPAN模块:
use Data::Dumper; sub flatten { map { ref $_ eq 'ARRAY' ? flatten(@$_) : $_ } @_; } my $input = [undef, [0, [1, [3,4]]], 2]; my @result = grep { defined } flatten(@$input); print Dumper \@result;
以上两种写法都保持了纯Perl核心实现,不需要安装第三方依赖,符合Perl的惯用写法。
内容的提问来源于stack exchange,提问作者Vinoth Karthick
相关产品推荐
相关产品推荐

