Perl 中单数组的多维数组输入

MultiDimensional array Input to Single array in Perl

我有以下输入和预期的输出。

Input : [undef,[0,1],2]
Expected Output : [0,1,2]

我写的代码:

use Data::Dumper;
my $input=[undef,[0,1],2];
my @arr=@{$input};
@arr = grep {defined} @arr;
my @arrnew;
foreach my $value (@arr){
  if (ref $value    eq 'ARRAY') {
    push @arrnew,@{$value};
  } else {
    push @arrnew,$value;
  }
}
print Dumper(@arrnew);

问题: 虽然,这给了我正确的输出,但想知道在 perl 中是否有更简单的方法。

您可以使用 map and grep.

将其全部合并为一个表达式
use strict;
use warnings;

my $foo = [undef,[0,1],2];
my @bar = map { ref eq 'ARRAY' ? @$_ : $_ } grep defined, @$foo;

map 就像您的 foreach 循环一样,并在输出时生成一个新列表,该列表被分配给一个新数组 @bargrep 您已经使用过,但我已将其更改为使用表达式语法而不是块语法。

请注意,这仅适用于一层深度。

对于更深层次的结构,可以使用递归子程序:

#!/usr/bin/perl
use warnings;
use strict;

sub flatten {
    my ($thing) = @_;
    return unless defined $thing;
    return $thing unless ref $thing;
    return map flatten($_), @$thing;
}

my $input = [undef, [0, 1], 2, [[[3]]]];
my $output = [flatten($input)];

use Test::More tests => 1;
is_deeply $output, [0, 1, 2, 3];