2012-06-22 21 views
6

次のコードでは、uninitialized valueという警告が表示されますが、2番目のgiven/whenの例でのみ表示されます。どうしてこれなの?given/when未定義の値

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

私が手出力は次のようになります。

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

答えて

3

given/whenは "smartmatch operator" を使用しています:~~

undef ~~ stringは次のとおりです。

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

は、このように、ここで何の警告はありません。

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

そしてundefに一致しようとすると警告が生成されます

undef ~~ regexです。

+1

したがって、これを修正するには、「定義済み」チェックを上部に置く必要がありますか? – simbabque

+0

@simbabque、それは警告を削除するでしょう。 – Qtax

1

when (EXPR)は通常when ($_ ~~ EXPR)となります。 undef ~~ 'string'!defined('string')なので、警告は表示されませんが、undef ~~ /regexp/undef =~ /regexp/ですので、警告が表示されます。

Switch Statements in perlsynおよびSmartmatch Operator in perlopを参照してください。