given ...when

The when construct can match against many types of expressions including scalars, aggregates, references, arbitrary comparison expressions, and even code references.

lhp@nereida:~/Lperltesting$ cat -n given2.pl 
 1  #!/usr/bin/env perl 
 2  use Modern::Perl;
 3                  # referencias a las 3 funciones
 4  my @options = ( \&piedra, \&papel, \&tijeras );
 5  
 6  do {
 7    say "¡Piedra, Papel, Tijeras!. Elije: ";
 8    chomp( my $user = <STDIN> );
 9    my $computer_match = $options[ int rand @options ];
10    $computer_match->( lc( $user ) ); 
11  } until (eof());
12  
13  sub piedra {
14    print "Elijo piedra. ";
15    given (shift) {
16      when ('papel')   { say "Tu ganas!"; break; }
17      when ('piedra')  { say "Empatados!"; break; }
18      when ('tijeras') { say "Yo gano!"; break; }
19      default          { say "No te entiendo"; exit(0); }
20    }
21  }
22  
23  sub papel {
24    print "Elijo papel. ";
25    given (shift) {
26      when (/^\s*papel/)   { say "Empatados!"; break; }
27      when (/^\s*piedra/)  { say "Yo gano!"; break; }
28      when (/^\s*tijeras/) { say "Tu ganas!"; break; }
29      default              { say "No te entiendo"; exit(0); }
30    }
31  }
32  
33  sub tijeras {
34    print "Elijo tijeras. ";
35    given (shift) {
36      when (/^\s*papel\s*$/)   { say "Yo gano!"; break; }
37      when (/^\s*piedra\s*$/)  { say "Tu ganas!"; break; }
38      when (/^\s*tijeras\s*$/) { say "Empatados!"; break; }
39      default                  { say "No te entiendo"; exit(0); }
40    }
41  }

Perl ejecuta default cuando ninguna de las otras condiciones casa.

lhp@nereida:~/Lperltesting$ ./given2.pl 
¡Piedra, Papel, Tijeras!. Elije: 
piedra papel
Elijo tijeras. No te entiendo
lhp@nereida:~/Lperltesting$ ./given2.pl 
¡Piedra, Papel, Tijeras!. Elije: 
piedra papel
Elijo piedra. No te entiendo
lhp@nereida:~/Lperltesting$ ./given2.pl 
¡Piedra, Papel, Tijeras!. Elije: 
piedra papel
Elijo piedra. No te entiendo
lhp@nereida:~/Lperltesting$ ./given2.pl 
¡Piedra, Papel, Tijeras!. Elije: 
piedra papel
Elijo piedra. No te entiendo
lhp@nereida:~/Lperltesting$ ./given2.pl 
¡Piedra, Papel, Tijeras!. Elije: 
piedra papel
Elijo papel. Yo gano!
piedra papel
¡Piedra, Papel, Tijeras!. Elije: 
Elijo piedra. No te entiendo

~/Lperltesting$ perl5.10.0 given2.pl 
¡Piedra, Papel, Tijeras!. Elije: 
                  tijeras      
Elijo papel. Tu ganas!
                  tijeras    
¡Piedra, Papel, Tijeras!. Elije: 
Elijo piedra. No te entiendo

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