如何过滤匹配时如何通过数组grep?

时间:2011-07-15 11:34:58

标签: arrays perl

是否有一种快速简便的方法来查找数组,找到满足某些测试的元素从原始数组中删除它们?

例如我想要

@a = (1, 7, 6, 3, 8, 4);
@b = grep_filter { $_ > 5 } @a;

# now @b = (7, 6, 8)
# and @a = (1, 3, 4)

换句话说,我想将一个数组拆分成两个数组:匹配的数组和不符合某个条件的数组。

4 个答案:

答案 0 :(得分:9)

了解您的图书馆,mang。

use List::MoreUtils qw(part);
part { $_>5 } (1, 7, 6, 3, 8, 4)

返回

(
    [1, 3, 4],
    [7, 6, 8],
)

答案 1 :(得分:8)

my @a = (1, 7, 6, 3, 8, 4);
my (@b, @c);    

push @{ $_ > 5 ? \@b : \@c }, $_ for @a;

答案 2 :(得分:3)

使用库是好的,但为了完整性,这里是问题中指定的函数:

sub grep_filter (&\@) {
    my ($code, $src) = @_;
    my ($i, @ret) = 0;
    local *_;
    while ($i < @$src) {
        *_ = \$$src[$i];
        &$code
            ? push @ret, splice @$src, $i, 1
            : $i++
    }
    @ret
}

my @a = (1, 7, 6, 3, 8, 4);
my @b = grep_filter {$_ > 5} @a;

say "@a"; # 1 3 4
say "@b"; # 7 6 8

答案 3 :(得分:-1)

这是你想要的吗?

@a = (1, 7, 6, 3, 8, 4);
@b = grep_filter { $_ > 5 } @a;
@a = grep_filter { $_ < 5 } @a;

在你的病情被否定的情况下再做一次grep。