我知道你可以使用grep
根据布尔条件过滤数组。但是,我希望得到2个数组:1表示匹配条件的元素,1表示失败的元素。例如,而不是这个,需要在列表上迭代两次:
my @arr = (1,2,3,4,5);
my @evens = grep { $_%2==0 } @arr;
my @odds = grep { $_%2!=0 } @arr;
我喜欢这样的事情:
my @arr = (1,2,3,4,5);
my ($evens, $odds) = magic { $_%2==0 } @arr;
magic
返回2个arrayrefs或其他内容。这样的运算符是否存在,或者我是否需要自己编写?
答案 0 :(得分:7)
在for
循环中将push
每个值简单地放到正确的数组中可能是最简洁的
use strict;
use warnings 'all';
my @arr = 1 .. 5;
my ( $odds, $evens );
push @{ $_ % 2 ? $odds : $evens }, $_ for @arr;
print "@$_\n" for $odds, $evens;
1 3 5
2 4
答案 1 :(得分:6)
List::UtilsBy::extract_by
与grep
类似,但它会修改输入列表:
use List::UtilsBy 'extract_by';
my @arr = (1,2,3,4,5);
my @evens = @arr;
my @odds = extract_by { $_ % 2 } @evens;
print "@evens\n@odds\n";
输出:
2 4
1 3 5
还有List::UtilsBy::partition_by
:
my %parts = partition_by { $_ % 2 } @arr;
@evens = @{$parts{0}}; # (2,4)
@odds = @{$parts{1}}; # (1,3,5)