Ostrzeżenia związane z akceptowanymi prototypami i niezależnie od c, czy dwa poniższe wymyślne podtytuły mogą istnieć w tym samym pakiecie, tj. Aby zapewnić opcjonalny parametr blokowy, taki jak sort
?Podprogramy, które przyjmują opcjonalny parametr blokowy
sub myprint {
for (@_) {
print "$_\n";
}
}
sub myprint (&@) {
my $block = shift;
for (@_) {
print $block->() . "\n";
}
}
W zamierzeniu podano podobną konwencję wywoływania, jak sort
, np. aby umożliwić wykonanie:
my @x = qw(foo bar baz);
print_list @x;
# foo
# bar
# baz
... i:
my @y = ({a=>'foo'}, {a=>'bar'}, {a=>'baz'});
print_list { $_->{a} } @y;
# foo
# bar
# baz
mogę przedefiniować i/lub ostrzeżenia prototyp niedopasowanie jeśli próbuję (co jest rozsądne).
Przypuszczam mogę zrobić:
sub myprint {
my $block = undef;
$block = shift if @_ && ref($_[0]) eq 'CODE';
for (@_) {
print (defined($block) ? $block->() : $_) . "\n";
}
}
... ale prototyp &@
zapewnia cukier syntaktyczny; usunięcie wymaga:
my @y = ({a=>'foo'}, {a=>'bar'}, {a=>'baz'});
print_list sub { $_->{a} }, @y; # note the extra sub and comma
(Próbowałem ;&@
, bezskutecznie - wciąż daje Type of arg 1 to main::myprint must be block or sub {} (not private array)
).
Nicea Post. Zastanawiam się, czy powinienem chociaż spróbować zrozumieć twój kod. Być może zachowaj go na weekendowy projekt. – Miller
Może powinienem dodać jeszcze kilka komentarzy, aby pokazać, co się dzieje ... – tobyink
Interesujące rzeczy, jeśli tylko przypomnę/przekonają mnie o dwóch rzeczach: (1) Perl jest czymś więcej niż kiedykolwiek będę pamiętał; i (2) dwie odmienne metody nie są aż tak duże! Wprowadzę wersję prototypową z blokiem jako 'myprint_over' i otrzymam' sub myprint {return myprint_over {$ _} @_; } '. Dzięki. – jimbobmcgee