首页 > 解决方案 > 扁平化任意深度的列表或数组的简单而优雅的方法是什么?

问题描述

> my @a = (3, [4,5, [6, 7 , (8,9, (10), 11), 12], 13], 14, 15)
[3 [4 5 [6 7 (8 9 10 11) 12] 13] 14 15]
> flat @a
(3 [4 5 [6 7 (8 9 10 11) 12] 13] 14 15) # ---------------------------> not flat enough
> say @a[*;*;*]
(3 4 5 6 7 (8 9 10 11) 12 13 14 15) # -------------------------------> but I don't know in advance how deep

my @a = (3, [4,5, [6, 7 , (8,9, (10), 11), 12], 13], 14, 15, ( "a", "A", "b", "B"), 99);
my @result = ();
sub flatDeep( $x ) {
    if $x ~~ (List, Array).any { # -----------------------------> not yet working on Hash or Set
        if $x.elems > 0 {
            flatDeep( $x[0] ) ;
            flatDeep( $x[1..*] );
        } 
    } else {
        @result.push( $x );
    };
}
flatDeep( @a );
say @result;

[3 4 5 6 7 8 9 10 11 12 13 14 15 a A b B 99] # ----------------------> achieved by clumsy routine not yet working on Hash or Set;

还有其他简单而优雅的方式来做同样的事情吗?谢谢。

标签: listrakuflattendepth

解决方案


推荐阅读