Vij*_*der 35
使用地图进行一级展平
$ref = [[1,2,3,4],[5,6,7,8]]; # AoA
@a = map {@$_} @$ref; # flattens it
print "@a"; # 1 2 3 4 5 6 7 8
Run Code Online (Sandbox Code Playgroud)
Eug*_*ash 15
使用List::Flatten
似乎是最简单的:
use List::Flatten;
my @foo = (1, 2, [3, 4, 5], 6, [7, 8], 9);
my @bar = flat @foo; # @bar contains 9 elements, same as (1 .. 9)
Run Code Online (Sandbox Code Playgroud)
使用flat
递归地做到这一点.
在最简单,最自然的方式,就是要遍历值,并使用@操作符来"解引用" /"解压"的任何现有嵌套值,以获得组成部分.然后对遇到的每个参考值重复该过程.
这与Viajayenders解决方案类似,但适用于数组引用中尚未存在的值以及任何嵌套级别:
sub flatten {
map { ref $_ ? flatten(@{$_}) : $_ } @_;
}
Run Code Online (Sandbox Code Playgroud)
尝试测试它:
my @l1 = [ 1, [ 2, 3 ], [[[4]]], 5, [6], [[7]], [[8,9]] ];
my @l2 = [ [1,2,3,4,5], [6,7,8,9] ];
my @l3 = (1, 2, [3, 4, 5], 6, [7, 8], 9); # Example from List::Flatten
my @r1 = flatten(@l1);
my @r2 = flatten(@l1);
my @r3 = flatten(@l3);
if (@r1 ~~ @r2 && @r2 ~~ @r3) { say "All list values equal"; }
Run Code Online (Sandbox Code Playgroud)