2012-06-22 14 views
6

W poniższym kodzie otrzymuję ostrzeżenie uninitialized value, ale tylko w drugim przykładzie given/when. Dlaczego to?given/when with undefined value

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

Wyjście pojawia się:

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

Odpowiedz

3

given/when wykorzystuje "smartmatch operator": ~~.

undef ~~ string jest:

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

Zatem nie ma tu ostrzeżenie.

undef ~~ regex jest:

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

I ostrzeżenie jest produkowany, gdy próbuje dopasować na undef.

+1

Czy powinien więc umieścić "zdefiniowany" na górze, aby to naprawić? – simbabque

+0

@imbabque, tak, aby usunąć ostrzeżenie. – Qtax