6

在以下代码中,我收到uninitialized value警告,但仅在第二个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
4

2 回答 2

3

given/when使用“智能匹配运算符”:~~

undef ~~ string是:

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

因此这里没有警告。

undef ~~ regex是:

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

并且在尝试匹配时会产生警告 on undef

于 2012-06-22T15:16:53.297 回答
1

调用when (EXPR)通常相等when ($_ ~~ EXPR)。所以你不会得到警告,但undef ~~ 'string'你会得到警告。!defined('string')undef ~~ /regexp/undef =~ /regexp/

请参阅中的 Switch 语句perlsynSmartmatch 运算符perlop

于 2012-06-22T15:18:24.653 回答