2012-06-22 12 views
6

Nel codice seguente, viene visualizzato un avviso uninitialized value, ma solo nel secondo esempio given/when. Perchè è questo?dato/se con valore non definito

#!/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"; 
    } 
} 

L'output che ottengo è:

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

risposta

3

given/when utilizza il "smartmatch operator": ~~.

undef ~~ string è:

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

Quindi non v'è alcun avviso qui.

undef ~~ regex è:

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

E un avvertimento viene prodotto quando si cerca di abbinare il undef.

+1

Quindi dovrebbe mettere il controllo 'defined' in alto per risolvere il problema? – simbabque

+0

@simbabque, sì che rimuoverebbe l'avviso. – Qtax

Problemi correlati