2012-06-22 35 views
6

Trong mã sau, tôi nhận được cảnh báo uninitialized value, nhưng chỉ trong ví dụ given/when thứ hai. Tại sao điều này?được cung cấp/khi có giá trị không xác định

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

Kết quả tôi nhận được là:

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

Trả lời

3

given/when sử dụng "smartmatch operator": ~~.

undef ~~ string là:

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

Như vậy không có cảnh báo ở đây.

undef ~~ regex là:

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

Và một cảnh báo được tạo ra khi cố gắng để phù hợp trên undef.

+1

Vì vậy, anh ta nên đặt kiểm tra 'đã xác định' ở trên cùng để sửa lỗi này? – simbabque

+0

@simbabque, có điều đó sẽ xóa cảnh báo. – Qtax

1

Gọi when (EXPR) thường bằng when ($_ ~~ EXPR). Và undef ~~ 'string'!defined('string') để bạn không nhận được cảnh báo, nhưng undef ~~ /regexp/undef =~ /regexp/ để bạn nhận được cảnh báo.

Xem Switch Statements in perlsynSmartmatch Operator in perlop.

Các vấn đề liên quan