2013-08-02 13 views
9

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

+5

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 –

+0

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

risposta

15

Vedere perldoc perlsub voce su Prototipi.

# 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 

Non dimenticare: Tutto questo è molto potente, naturalmente, e deve essere utilizzato solo con moderazione per rendere il mondo un posto migliore.

+2

+1 per ricordare il potere e la responsabilità – pilcrow

0

Sono d'accordo con il resto: non utilizzare i prototipi secondari a meno che non si sappia cosa si sta facendo. "Con un grande potere derivano grandi responsabilità." Quelli sembrano creati da qualcuno abituato ai prototipi C. Ad esempio, il sub sum davvero dovrebbe avere questo prototipo:

sub sum (\$\$\$) { 
Problemi correlati