2013-08-02 6 views
9

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).

+5

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 –

+0

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. –

Antwort

15

Siehe perldoc perlsub Eintrag auf Prototypen.

# Declared as   Called as 
sub mylink ($$)  mylink $old, $new 
sub myvec ($$$)  myvec $var, $offset, 1 
sub myindex ($$;$)  myindex &getstring, "substr" 
sub mysyswrite ($$$;$) mysyswrite $buf, 0, length($buf) - $off, $off 
sub myreverse (@)  myreverse $a, $b, $c 
sub myjoin ([email protected])  myjoin ":", $a, $b, $c 
sub mypop (+)   mypop @array 
sub mysplice ([email protected]) mysplice @array, 0, 2, @pushme 
sub mykeys (+)   mykeys %{$hashref} 
sub myopen (*;$)  myopen HANDLE, $name 
sub mypipe (**)  mypipe READHANDLE, WRITEHANDLE 
sub mygrep (&@)  mygrep { /foo/ } $a, $b, $c 
sub myrand (;$)  myrand 42 
sub mytime()   mytime 

Nicht vergessen: Das alles ist sehr mächtig, natürlich, und soll nur in Maßen verwendet werden, die Welt zu einem besseren Ort zu machen.

+2

+1 für die Erinnerung an Macht und Verantwortung – pilcrow

0

Ich stimme dem Rest zu: Verwenden Sie keine Sub-Prototypen, außer Sie wissen, was Sie tun. "Mit großer Kraft kommt große Verantwortung." Die sehen aus, als wären sie von jemandem erstellt worden, der an C-Prototypen gewöhnt war. Zum Beispiel sollte die Unter sum wirklich diesen Prototyp hat:

sub sum (\$\$\$) { 
Verwandte Themen