perl parameters

¿Qué significan los caracteres de dólar, signo y punto y coma en las listas de parámetros de Perl?



parameters (2)

He encontrado varios scripts de Perl en la base de código en mi trabajo. Algunos de ellos contienen subrutinas con la siguiente rareza de sintaxis:

sub sum($$$) { my($a,$b,$m)=@_; 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($$@) { my $h = shift; my $i = shift; if ($i > 0) { print $h (('''')x$i, map ''<''.$_.''>'', @_); } else { print $h map ''<''.$_.''>'', @_; } }

Dejando a un lado la cuestión de qué deben hacer estas subrutinas (no estoy del todo seguro de mí mismo ...), ¿qué significan las secuencias de caracteres en la posición ''lista de parámetros''? Verbigracia. las secuencias $$$ , $$;$$ y $$@ en estos ejemplos.

Tengo una comprensión muy limitada de Perl, pero creo que el my($a,$b,$m)=@_; line en el primer ejemplo ( sum ) descomprime los parámetros pasados ​​a la subrutina en las variables locales $a , $b y $m . Esto sugiere que el $$$ indica la aridad y la firma del tipo de la sum (en este caso, espera tres escalares). Esto podría sugerir potencialmente que gOut espera dos escalares y una matriz. ¿Es esta la interpretación correcta?

Incluso si la interpretación anterior es correcta, estoy perdido en cuanto al significado del punto y coma en la segunda rutina ( gNode ).


Estoy de acuerdo con el resto: no uses sub prototipos a menos que sepas lo que estás haciendo. "Con un gran poder viene una gran responsabilidad." Esos parecen creados por alguien acostumbrado a los prototipos C. Por ejemplo, la sub sum realmente debería tener este prototipo:

sub sum (/$/$/$) {


Ver la entrada Perlub Perlub en Prototipos .

# 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 ($@) myjoin ":", $a, $b, $c sub mypop (+) mypop @array sub mysplice (+$$@) 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

No lo olvides: todo esto es muy poderoso, por supuesto, y debe usarse solo con moderación para hacer del mundo un lugar mejor.