我有以下輸入和預期輸出。
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 中是否有更簡單的方法。
uj5u.com熱心網友回復:
您可以使用mapand 將其全部合并為一個運算式grep。
use strict;
use warnings;
my $foo = [undef,[0,1],2];
my @bar = map { ref eq 'ARRAY' ? @$_ : $_ } grep defined, @$foo;
該map行為像您的foreach回圈和出路,這被分配到一個新的陣列產生一個新的串列@bar。在grep你已經使用了,但我已經改變了它使用運算式語法,而不是塊語法。
請注意,這僅適用于一個深度級別。
uj5u.com熱心網友回復:
對于更深的結構,您可以使用遞回子程式:
#!/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];
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/369525.html
