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 中是否有更简单的方法。
将其全部合并为一个表达式
use strict;
use warnings;
my $foo = [undef,[0,1],2];
my @bar = map { ref eq 'ARRAY' ? @$_ : $_ } grep defined, @$foo;
map
就像您的 foreach
循环一样,并在输出时生成一个新列表,该列表被分配给一个新数组 @bar
。 grep
您已经使用过,但我已将其更改为使用表达式语法而不是块语法。
请注意,这仅适用于一层深度。
对于更深层次的结构,可以使用递归子程序:
#!/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];
我有以下输入和预期的输出。
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 中是否有更简单的方法。
use strict;
use warnings;
my $foo = [undef,[0,1],2];
my @bar = map { ref eq 'ARRAY' ? @$_ : $_ } grep defined, @$foo;
map
就像您的 foreach
循环一样,并在输出时生成一个新列表,该列表被分配给一个新数组 @bar
。 grep
您已经使用过,但我已将其更改为使用表达式语法而不是块语法。
请注意,这仅适用于一层深度。
对于更深层次的结构,可以使用递归子程序:
#!/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];