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
