2010-05-21 9 views

Respuesta

10

Bueno, si quieres dos matrices se puede usar un prototipo:

sub foo (\@\@) { 
    my $arr1 = shift; 
    my $arr2 = shift; 

    # Access arrays as references 
} 

foo(@wiz, @waz); # @wiz and @waz won't be flattened. 

pero hay muchas maneras de conseguir alrededor prot otypes, y prefiero evitarlos en la mayoría de los lugares. Usted puede simplemente omitir el prototipo y pasar manualmente las referencias:

sub foo { 
    my $arr1 = shift; 
    my $arr2 = shift; 

    # Access arrays as references 
} 

foo(\@wiz, \@waz); # Pass in wiz/waz as refs 
foo([1,2,4],[3,5,6]); # Hard coded arrays 

Si usted no ha trabajado con referencias en absoluto, echa un vistazo a perlreftut para un buen tutorial.

+0

parece que el prototipo es una solución mejor, ya que no requeriría que el usuario hiciera nada especial para pasar los argumentos de la lista. gracias – Mike

+14

@Mike, recomendaría en contra de los prototipos, ya que un programador perl experimentado se sorprenderá más de ellos que el requisito de pasar una referencia. Consulte http://stackoverflow.com/questions/297034/why-are-perl-function-prototypes-bad para obtener más información sobre por qué los prototipos están mal visto. – daotoad

+0

@Mike, uso prototipos tan a menudo que cometí un error en la especificación de mi prototipo que acabo de darme cuenta. Entonces, si ya probaste mi código de muestra y no funcionó, ten en cuenta el cambio en el prototipo. – daotoad

5

Si pasa dos listas por valor ... obtendrá una gran lista en @_.

my(@list1,@list2) = @_; no tiene ningún sentido:

#!/usr/bin/perl 

sub test 
{ 
    my (@a, @b) = @_; 

    print "@a\n"; 
    print "@b\n"; 
} 

my @array1 = (1,2,3); 
my @array2 = (5,6,7); 

test(@array1, @array2); 

Esto va a terminar la impresión:

1 2 3 5 6 7 
<blank line> 

Para pasar dos matrices, que había necesidad de pasarlos por referencia:

test(\@array1, \@array2); 

Y en su sub debe tratarlos como referencias:

sub test 
{ 
    my ($arrayRef1, $arrayRef2) = @_; 
    print "@$arrayRef1\n"; 
    print "@$arrayRef2\n"; 
} 
Cuestiones relacionadas