Introducción: El Problema

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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19