Как насчет использования $code->($arg)
?
sub mygrep (&@) {
my $code = shift;
my @result;
foreach my $arg (@_) {
push(@result, $arg) if $code->( $arg);
}
@result;
}
Я не проверял это, но я бы предположил, что это сработает, и это позволит вам передать дополнительные аргументы $code
.
Обновлено: это выглядело забавно, поэтому я пошел и проверил его.Это работает просто отлично, см. Ниже (мне очень не нравятся прототипы, поэтому я удалил его, тем более, что он постоянно жаловался на то, что @a не является ссылкой на массив; - (
#!/usr/bin/perl
use strict;
use warnings;
sub mygrep {
my $code = shift;
my @result;
foreach my $arg (@_) {
push(@result, $arg) if $code->( $arg);
}
@result;
}
my @a= ( 1, 2, 3, 4, 5, 6);
print mygrep( sub { return shift() % 2 }, @a), "\n";
И, конечно, главное удовольствиес этой линии мышления также генерировать код;
#!/usr/bin/perl
use strict;
use warnings;
sub mygrep {
my $code = shift;
my $filter= shift;
my @result;
foreach my $arg (@_) {
push(@result, $arg) if $code->( $arg);
}
@result;
}
my @a= ( 1, 2, 3, 4, 5, 6, 7, 8, 9);
print mygrep( mod_filter( 3), @a), "\n";
print mygrep( mod_filter( 4), @a), "\n";
sub mod_filter
{ my( $filter)= @_;
return sub { ! (shift() % $filter) };
}