使用grep基于条件的Perl分裂数组

har*_*gnj 8 arrays perl grep

我有一些看起来像这样的perl代码:

my @array = map { rand } ( 1..100 );
my @matching = grep { $_ == $condition } @array;
@array = grep { $_ != $condition } @array;
Run Code Online (Sandbox Code Playgroud)

这样做没问题,但我想做的是根据单个操作将原始数组拆分为两个...我认为我执行的操作数量是严格必要的两倍.

帮助赞赏!! 谢谢.

Bra*_*ert 10

这是part列表:: MoreUtils就派上用场了.

use List::MoreUtils qw'part';
my($even,$odd) = part { $_ % 2 } @array;
Run Code Online (Sandbox Code Playgroud)

如果您希望输入的每个元素恰好在输出的一个数组中,那么这很有用.


如果你想将它们放在多个数组中,你必须自己遍历它们.
最好的方法是使用foreach循环.

my(@div2,@div3);
for my $elem (@array){
  push @div2, $elem unless $elem % 2;
  push @div3, $elem unless $elem % 3;
}
Run Code Online (Sandbox Code Playgroud)

如果你需要做很多类似的检查,也许你应该循环你的测试对象.

my %div;
for my $elem (@array){
  for my $div (2,3,5,7,11,13){
    push @{ $out{$div} }, $elem unless $elem % $div;
  }
}
Run Code Online (Sandbox Code Playgroud)


Fil*_*efp 6

到目前为止,最简单的方法是迭代您的数组并根据条件将值推送到两个数组中的任何一个,如下例所示.

for (@array) {
  if ($_ % 2) {push @odd,  $_}
  else        {push @even, $_}
}
Run Code Online (Sandbox Code Playgroud)

如果您想修改源数组:

for (my $i =0; $i < @array; ++$i) {
  if ($array[$i] % 2) {
    push @odd, splice (@array, $i--, 1);
  }
}
Run Code Online (Sandbox Code Playgroud)

你为什么不推荐List :: MoreUtils :: part?

有问题的模块可能不存在于目标系统上,这总是令人讨厌的事情.

同样在系统上我运行测试我发现List::MoreUtils::part这个帖子的速度是第一个片段的两倍,尽管part实际上它的实现方式可能相反.