perl:将数组拆分为匹配和不匹配

时间:2017-07-11 16:11:03

标签: arrays perl

我知道你可以使用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或其他内容。这样的运算符是否存在,或者我是否需要自己编写?

2 个答案:

答案 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_bygrep类似,但它会修改输入列表:

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)