如何根据条件将列表分成两部分?

Ann*_*nna 4 perl list perl-module partition

是否有一个类似于grep的函数,可以将列表分为与表达式匹配的部分(如grep所做的那样)及其补集?

当然,编写这样的函数非常简单,但我有兴趣知道它是否已经存在并且可以更方便地包含在任何List::Util类似的模块中。

Ann*_*nna 6

我在发布问题后立即浏览 List::MoreUtils 找到了答案(抱歉)。它的一部分

根据BLOCK的返回值对LIST进行分区,BLOCK的返回值表示当前值被放入哪个分区。返回由此创建的分区的列表。创建的每个分区都是对数组的引用。

my $i = 0;
my @part = part { $i++ % 2 } "a".."h";   # Returns [qw( a c e g )], [qw( b d f h )]
Run Code Online (Sandbox Code Playgroud)


Sha*_*awn 5

如果您所处的环境不允许您安装模块,那么这里有一个List::MoreUtils::part不依赖于任何内容的版本:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;

sub part(&@) {
    my $f = shift;
    my @parts;
    for (@_) {
        my $bucket = $f->();
        push @{$parts[$bucket]}, $_;
    }
    return @parts;
}

my ($evens, $odds) = part { $_ % 2 } 1..10;
say "Even numbers: @$evens";
say " Odd numbers: @$odds";
Run Code Online (Sandbox Code Playgroud)