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

ewo*_*wok 4 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;
Run Code Online (Sandbox Code Playgroud)

我想要这样的事情:

my @arr = (1,2,3,4,5);
my ($evens, $odds) = magic { $_%2==0 } @arr;
Run Code Online (Sandbox Code Playgroud)

magic返回2个arrayrefs什么的.这样的运营商是否存在,或者我是否需要自己编写?

Bor*_*din 7

pushfor循环中简单地将每个值放到正确的数组中可能是最简洁的

use strict;
use warnings 'all';

my @arr = 1 .. 5;

my ( $odds, $evens );

push @{ $_ % 2 ? $odds : $evens }, $_ for @arr;


print "@$_\n" for $odds, $evens;
Run Code Online (Sandbox Code Playgroud)

产量

1 3 5
2 4
Run Code Online (Sandbox Code Playgroud)


mob*_*mob 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";
Run Code Online (Sandbox Code Playgroud)

输出:

2 4
1 3 5
Run Code Online (Sandbox Code Playgroud)

还有List::UtilsBy::partition_by:

my %parts = partition_by { $_ % 2 } @arr;
@evens = @{$parts{0}};   # (2,4)
@odds = @{$parts{1}};    # (1,3,5)
Run Code Online (Sandbox Code Playgroud)