我知道你可以用来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什么的.这样的运营商是否存在,或者我是否需要自己编写?
push在for循环中简单地将每个值放到正确的数组中可能是最简洁的
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)
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)
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |