相当于Ruby的Perl';拒绝!`?

相当于Ruby的Perl';拒绝!`?,ruby,perl,arrays,Ruby,Perl,Arrays,我需要在Perl中遍历一个数组,并有条件地删除元素。我知道slice,但不知道如何在foreach上下文中使用它 在Ruby中,有reject: foo = [2, 3, 6, 7] foo.reject! { |x| x > 3 } p foo # outputs "[2, 3]" 是否有一个Perl等价物?@foo=(2,3,6,7); @foo = (2, 3, 6, 7); @foo = grep { $_ <= 3 } @foo; print @foo; # 23

我需要在Perl中遍历一个数组,并有条件地删除元素。我知道
slice
,但不知道如何在
foreach
上下文中使用它

在Ruby中,有
reject

foo = [2, 3, 6, 7]
foo.reject! { |x| x > 3 }
p foo   # outputs "[2, 3]"
是否有一个Perl等价物?

@foo=(2,3,6,7);
@foo = (2, 3, 6, 7);
@foo = grep { $_ <= 3 } @foo;
print @foo; # 23
@foo=grep{$\
vinko@parrot:/home/vinko#more reject.pl
我的@numbers=(2,3,6,7);

打印连接(“,”,grep{$\,正如其他答案所建议的,通常就是您所需要的

但是,perl可以编写一个函数,比如ruby的
数组#reject!

foo = [2, 3, 6, 7]
foo.reject! { |x| x > 3 }
p foo   # outputs "[2, 3]"
  • 接受块
  • 可以就地修改其参数数组
用途是:

@foo = (2, 3, 6, 7);            # Void context - modify @foo in place
reject { $_ > 3 } @foo;         # @foo is now (2, 3)

@foo = (2, 3, 6, 7);            # Scalar context - modify @foo in place
$n = reject { $_ > 3 } @foo;    # @foo is now (2, 3), $n is length of modified @foo

@foo = (2, 3, 6, 7);            # Array context - return a modified copy of @foo
@cpy = reject { $_ > 3 } @foo;  # @cpy is (2, 3), @foo is (2, 3, 6, 7)
实施:

sub reject(&\@) {
    my ($block, $ary) = @_;

    # Return a copy in an array context
    return grep {! $block->() } @$ary if wantarray;

    # Otherwise modify in place.  Similar to, but not
    # quite, how rb_ary_reject_bang() does it.
    my $i = 0;
    for (@$ary) {
            next if $block->();
            ($ary->[$i], $_) = ($_, $ary->[$i]); # swap idiom to avoid copying
            $i++;                                # possibly huge scalar
    }
    $#$ary = $i - 1;  # Shorten the input array

    # We differ from Array#reject! in that we return the number of
    # elements in the modified array, rather than an undef value if
    # no rejections were made
    return scalar(@$ary) if defined(wantarray);
}

哇,令人印象深刻。我以为我问的是一个完整的Perl初学者问题,但你的答案是第三高票o@Sht当然,可以使用任何布尔表达式。
grep{/test/}qw(test foo bar testing)
谢谢,@Konerak。和其他许多人一样,我倾向于回避原型/块语法,但这一语法似乎直观且可能有用。:)CPAN的List::UtilsBy有一个与上面的reject类似的extract_by()函数,但它返回被拒绝的元素(这里称为extracted elements),而不是您已经拥有的数组的副本(你显然想使用它,否则为什么还要修改它呢)。我认为Leonerd的函数是一个更有用的返回值。它还使用\@proto@masonk,酷!我看过CPAN上的各种列表/数组模块,但没有看到。FWIW,我同意这种返回方式在perl的思维框架中更自然一些。