Práctica: Emulación de un Switch

Vamos a realizar una función de orden superior: Emule la sentencia switch de C usando un hash de punteros a subrutinas. Escriba una función switch que recibe como segundo parámetro un hash con claves las constantes del case y como valores las referencias a las subrutinas. Cómo primer parámetro recibe un valor escalar. Según sea el valor deberá ejecutar la subrutina con clave correspondiente. Si no hay ninguna clave con ese valor deberá de ejecutar la subrutina que corresponde a la clave default, si tal clave existe en el hash. Aqui tiene una indicación de como hacerlo:
lhp@nereida:~/Lperl/src$ cat switch.pl
#!/usr/local/bin/perl -w
use strict;
use warnings;

sub switch {
  my $exp = shift or die "switch error: expecting an expression\n";
  die "switch error. Empty cases\n" unless @_;
  my %cases = @_;

  if (exists($cases{$exp})) {
    die "switch error. Expected code for <$exp>\n" unless ref($cases{$exp}) eq 'CODE';
    ........................
  }
  ..........................
}

my $x = 4;
switch $x,
  2 => sub { print "two\n" },
  3 => sub { print "three\n" },
  4 => sub { print "four\n" },
  default => sub { print "Other value\n" }
;

En el ejemplo que haga para la llamada a la función switch use subrutinas anónimas cuando el código en cuestión lleve menos de una lınea.

El módulo Switch de Damian Conway proporciona una sentencia switch mas completa. Sigue un ejemplo de uso:

$ cat -n useswitch.pl
     1  #!/usr/local/bin/perl5.8.0 -w
     2
     3  use Switch;
     4
     5  $val = shift;
     6
     7  switch ($val) {
     8    case 1 { print "number 1\n" }
     9    case "hello" { print "string hello\n" }
    10    else { print " none of these two\n" }
    11  }

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