2012-06-22 8 views
6

En el siguiente código, recibo una advertencia uninitialized value, pero solo en el segundo ejemplo given/when. ¿Por qué es esto?dado/cuando con el valor indefinido

#!/usr/bin/env perl 
use warnings; 
use 5.12.0; 

my $aw; 

given ($aw) { 
    when ('string') { 
     say "string"; 
    } 
    when (not defined) { 
     say "aw not defined"; 
    } 
    default { 
     say "something wrong"; 
    } 
} 

given ($aw) { 
    when (/^\w+$/) { 
     say "word: $aw"; 
    } 
    when (not defined) { 
     say "aw not defined"; 
    } 
    default { 
     say "something wrong"; 
    } 
} 

La salida que recibo es:

aw not defined 
Use of uninitialized value $_ in pattern match (m//) at ./perl.pl line 20. 
aw not defined 

Respuesta

3

given/when utiliza el "smartmatch operator": ~~.

undef ~~ string es:

undef  Any  check whether undefined 
        like: !defined(Any) 

Por lo tanto no hay ninguna advertencia aquí.

undef ~~ regex es:

Any  Regexp  pattern match          
         like: Any =~ /Regexp/ 

y una advertencia se produce cuando se intenta hacer coincidir el undef.

+1

Entonces, ¿debería poner la marca 'definida' en la parte superior para arreglar esto? – simbabque

+0

@simbabque, eso eliminaría la advertencia. – Qtax

1

Llamando when (EXPR) generalmente igual when ($_ ~~ EXPR). Y undef ~~ 'string' es !defined('string'), por lo que no recibirá ninguna advertencia, pero undef ~~ /regexp/ es undef =~ /regexp/ para que reciba una advertencia.

Ver Switch Statements in perlsyn y Smartmatch Operator in perlop.

Cuestiones relacionadas