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)

  • 值得一无所知只有$ ref填充了arrayrefs才有效.如果它是scalars和arrayrefs的混合,将无法工作. (5认同)

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递归地做到这一点.


Gar*_*ren 9

最简单,最自然的方式,就是要遍历值,并使用@操作符来"解引用" /"解压"的任何现有嵌套值,以获得组成部分.然后对遇到的每个参考值重复该过程.

这与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)