Ich habe eine Reihe von Perl-Skripten in der Codebasis bei meinem Job gefunden. Einige von ihnen enthalten Subroutinen mit folgenden Syntax Kuriosität:Was bedeuten Dollar-, At-Zeichen- und Semikolonzeichen in Perl-Parameterlisten?
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 '<'.$_.'>', @_;
}
}
Abgesehen von der Frage, was diese Unterprogramme sollen tun (ich bin nicht ganz sicher, ob ich ...), was tun, um die Sequenzen von Zeichen in die Position der Parameterliste bedeutet? Nämlich. die $$$
, $$;$$
und [email protected]
Sequenzen in diesen Beispielen.
Ich habe ein sehr begrenztes Verständnis von Perl, aber ich glaube, dass die my($a,$b,$m)[email protected]_;
Linie im ersten Beispiel (sum
) an das Unterprogramm in die $a
geleitet, $b
und $m
lokalen Variablen die Parameter auspackt. Dies legt nahe, dass $$$
die Arity- und Typ-Signatur von sum
anzeigt (in diesem Fall werden drei Skalare erwartet). Dies würde möglicherweise vorschlagen, dass gOut
zwei Skalare und ein Array erwartet. Ist das die richtige Interpretation?
Auch wenn die obige Interpretation korrekt ist, bin ich in Bezug auf die Bedeutung des Semikolons in der zweiten Routine verloren (gNode
).
Diese Symbole im Allgemeinen bedeuten, dass der Code von jemandem geschrieben wurde, der nicht wirklich wussten, was sie taten. Perl-Prototypen sind nur in wenigen Fällen sinnvoll. Und das sind keine dieser Fälle. Siehe http://www.perlmonks.org/?node_id=861966 –
Der Knoten "Perl Monks", auf den [Dave Cross] (http://stackoverflow.com/users/7231/dave-cross) im vorherigen [Kommentar] (http://stackoverflow.com/questions/18006898/what-do-dollar-at-sign-and-semicolon-characters-in-perl-parameter-lists-mean#comment26344863_18006898) ist [Weit mehr als alles, was Sie jemals haben Wollte über Prototypen in Perl wissen] (http://www.perlmonks.org/?node_id=861966). Es sollte Pflichtlektüre für jeden sein, der Prototypen in Perl verwenden möchte. Sie müssen es nur einmal lesen, da Sie nach dem Lesen keine Prototypen in Perl verwenden möchten. –