15.03.2020 Views

perl-language-es

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

test_some_subroutine @x, 'hi', @y; # 7 argument(s) passed into subroutine

# @_ = ( 1, 2, 3, 'hi', 'a', 'b', 'c' ) # Done internally for this call

Si su test_some_subroutine contiene la instrucción $_[4] = 'd' , para la llamada anterior causará

que $y[0] tenga un valor d después:

print "@y"; # d b c

Lista de retorno de subrutina

Por supuesto, puede devolver listas de subs:

sub foo {

my @list1 = ( 1, 2, 3 );

my @list2 = ( 4, 5 );

}

return ( @list1, @list2 );

my @list = foo();

print @list; # 12345

Pero no es la forma recomendada de hacerlo a menos que sepa lo que está haciendo.

Si bien esto está bien cuando el resultado está en el contexto LISTA , en el contexto SCALAR las

cosas no están claras. Echemos un vistazo a la siguiente línea:

print scalar foo(); # 2

¿Por qué 2 ? Que esta pasando?

1. Debido a que foo() evaluó en el contexto SCALAR , esta lista ( @list1, @list2 ) también se

evaluó en el contexto SCALAR

2. En contexto SCALAR , LIST devuelve su último elemento. Aquí está @list2

3. De nuevo en el contexto SCALAR , array @list2 devuelve el número de sus elementos. Aquí

está el 2 .

En la mayoría de los casos, la estrategia correcta devolverá las referencias a las estructuras

de datos .

Así que en nuestro caso deberíamos hacer lo siguiente:

return ( \@list1, \@list2 );

Luego, la persona que llama hace algo como esto para recibir los dos arrayrefs devueltos:

my ($list1, $list2) = foo(...);

Usando arrayref para pasar array a sub

https://riptutorial.com/es/home 66

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!