Gli avvertimenti associati ai prototipi accettati e nonostante, possono esistere i due sotto-sotto-sotto-derivati all'interno dello stesso pacchetto, vale a dire fornire un parametro di blocco opzionale come sort
?Sottoroutine che prendono un parametro di blocco facoltativo
sub myprint {
for (@_) {
print "$_\n";
}
}
sub myprint (&@) {
my $block = shift;
for (@_) {
print $block->() . "\n";
}
}
L'intento è di fornire una convenzione di chiamata simile come sort
, ad esempio per consentire l'esecuzione di:
my @x = qw(foo bar baz);
print_list @x;
# foo
# bar
# baz
... e:
my @y = ({a=>'foo'}, {a=>'bar'}, {a=>'baz'});
print_list { $_->{a} } @y;
# foo
# bar
# baz
ottengo ridefinire e/o avvisi prototipo mancata corrispondenza se provo (che è ragionevole).
Suppongo che posso fare:
sub myprint {
my $block = undef;
$block = shift if @_ && ref($_[0]) eq 'CODE';
for (@_) {
print (defined($block) ? $block->() : $_) . "\n";
}
}
... ma il prototipo &@
fornisce lo zucchero sintattico; rimozione richiede:
my @y = ({a=>'foo'}, {a=>'bar'}, {a=>'baz'});
print_list sub { $_->{a} }, @y; # note the extra sub and comma
(ho provato ;&@
, senza alcun risultato - produce ancora Type of arg 1 to main::myprint must be block or sub {} (not private array)
.)
Nizza Post. Sto discutendo se dovrei provare a capire il tuo codice. Forse salvalo per un progetto del fine settimana. – Miller
Forse dovrei aggiungere qualche altro commento per mostrare cosa sta succedendo ... – tobyink
Cose interessanti, se non altro per ricordare/convincermi di due cose: (1) c'è più per Perl di quanto ricorderò mai; e (2) due metodi distinti non è un grosso problema !! Introdurrò la versione prototipata con blocco come 'myprint_over' e avrò' sub myprint {return myprint_over {$ _} @_; } '. Grazie. – jimbobmcgee