Như câu trả lời khác đề nghị, grep
thường là tất cả các bạn cần.
Tuy nhiên, nó có thể với perl prototypes mã một hàm rằng, giống như ruby của Array#reject!
:
- chấp nhận một khối
- có thể sửa đổi mảng đối số của nó ở vị trí
Cách sử dụng là:
@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)
Thực hiện:
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);
}
Woah, ấn tượng. Tôi nghĩ rằng tôi đã hỏi một câu hỏi Perl của người mới bắt đầu hoàn chỉnh ở đó, nhưng câu trả lời của bạn là câu trả lời thứ ba của bạn. : o –
@ Shtééf: câu hỏi của người mới bắt đầu thường là những câu hỏi hữu ích. –
@knittl giải pháp của bạn có thể được mở rộng để thay thế <= bằng cụm từ thông dụng không? – Bnjmn