Ho incontrato un numero di script Perl nel codebase nel mio lavoro. Alcuni di essi contengono subroutine con la seguente stranezza sintassi:Cosa significano i caratteri dollaro, at-sign e punti e virgola negli elenchi parametri Perl?
sub sum($$$) {
my($a,$b,$m)[email protected]_;
for my $i (0..$m) {
$$a[$i] += $$b[$i] if $$b[$i] > 0;
}
}
sub gNode($$;$$) {
my($n,$l,$s,$d) = @_;
return (
"Node name='$n' label='$l' descr='$d'" ,
$s ? ("Shape type='$s' /") :(),
'/Node'
);
}
sub gOut([email protected]) {
my $h = shift;
my $i = shift;
if ($i > 0) {
print $h (('')x$i, map '<'.$_.'>', @_);
} else {
print $h map '<'.$_.'>', @_;
}
}
Lasciando da parte la questione di ciò che queste subroutine sono destinati a fare (io non sono del tutto sicuro di me ...), cosa fanno le sequenze di caratteri in la posizione "elenco parametri" significa? Cioè. le sequenze $$$
, $$;$$
e [email protected]
in questi esempi.
ho una comprensione molto limitata di Perl, ma ritengo che la linea my($a,$b,$m)[email protected]_;
nel primo esempio (sum
) decomprime i parametri passati alla subroutine nelle variabili locali $a
, $b
e $m
. Ciò suggerisce che il $$$
indica la firma arity e type di sum
(in questo caso prevede tre scalari). Ciò suggerirebbe potenzialmente che gOut
prevede due scalari e un array. È questa l'interpretazione corretta?
Anche se l'interpretazione di cui sopra è corretta, sono perso per quanto riguarda il significato del punto e virgola nella seconda routine (gNode
).
Quei simboli generalmente significa che il codice è stato scritto da qualcuno che non sanno quello che stavano facendo. I prototipi Perl sono davvero utili solo in un piccolo numero di casi. E questi non sono nessuno di quei casi. Vedi http://www.perlmonks.org/?node_id=861966 –
Il nodo Perl Monks a cui fa riferimento [Dave Cross] (http://stackoverflow.com/users/7231/dave-cross) nel precedente [commento] (http://stackoverflow.com/questions/18006898/what-do-dollar-at-sign-and-semicolon-characters-in-perl-parameter-lists-mean#comment26344863_18006898) è [Molto più di tutto ciò che hai sempre Volevo sapere su Prototipi in Perl] (http://www.perlmonks.org/?node_id=861966). Dovrebbe essere una lettura obbligatoria per chiunque abbia intenzione di utilizzare prototipi in Perl. Devi solo leggerlo una volta perché non prevedi di utilizzare i prototipi in Perl dopo averlo letto. –