La función reverse

El operador reverse toma los elementos de una lista y devuelve la lista en orden inverso:

  DB<1> @a = 1..10
  DB<2> @a = reverse @a
  DB<3> p "@a"
10 9 8 7 6 5 4 3 2 1

En un contexto escalar, cuando reverse es aplicado a una lista devuelve la cadena resultante de concatenar los elementos de la lista en orden inverso:

  DB<6> @a = 1..10
  DB<7> $b = reverse @a
  DB<8> p $b
01987654321
  DB<9> @a = qw{one two three}
  DB<10> $x = reverse @a
  DB<11> p $x
eerhtowteno

Si se aplica a una cadena en un contexto escalar produce la recíproca de la cadena:

  DB<29> q
lhp@nereida:~/public_html/cgi-bin$ perl -wde 0
main::(-e:1):   0
  DB<1> $a = "dabale arroz a la zorra el abad"
  DB<2> p scalar(reverse($a))
daba le arroz al a zorra elabad

Sin embargo, en un contexto de lista la cadena queda sin modificar:

  DB<3> p reverse($a)
dabale arroz a la zorra el abad

Tenga cuidado si esta trabajando en un entorno que usa UTF-8. En ese caso reverse puede producir un resultado erróneo:

lhp@nereida:~/Lperl/src$ perl -we 'print reverse("dábale arroz a la zorra el abad")."\n"'
daba le arroz al a zorra elab##d

Para solucionarlo es necesario usar el módulo utf8 y poner el fichero de salida en modo :utf8:

lhp@nereida:~/Lperl/src$ cat -n reverse.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3  use warnings;
 4  use utf8;
 5  binmode STDOUT, ':utf8';
 6  my $x = shift || "dábale arroz a la zorra el abad";
 7  print reverse($x)."\n"; # Contexto escalar forzado por el "."
Cuando se ejecuta se obtiene:
lhp@nereida:~/Lperl/src$ reverse.pl
daba le arroz al a zorra elabád

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