Como ejemplo, supongamos que queremos escribir una función shift2
que retorna y elimina los dos primeros elementos del principio de un array.
Nos gustaría usarla como shift
:
@a = 1..10; ($f, $s) = shift2 @a;
Si queremos escribirla, no vale hacer:
sub shift2 { splice @_, 0, 2 }
Observe el comportamiento del siguiente programa.
$ cat -n shift2.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 sub shift2 { splice @_, 0, 2 } 5 6 my @a = 1..5; 7 my ($f, $g) = shift2 @a; 8 9 local $" = ','; 10 print "f = $f, g = $g \@a = (@a)\n"; $ ./shift2.pl f = 1, g = 2 @a = (1,2,3,4,5)La llamada a
splice
en la línea 4 retira
Los elementos de @_
pero no del array @a
.
La solución al problema es pasar el array por referencia:
sub shift2 { splice @{$_[0]}, 0, 2 }pero entonces la llamada queda distinta, obligándonos a pasar la referencia:
@a = 1..10; ($f, $s) = shift2 \@a;
Casiano Rodríguez León