2010-08-31 28 views

Trả lời

23

Mô-đun Perl phải kết thúc bằng giá trị thực hoặc nếu không được coi là không đã được tải. Theo quy ước, giá trị này thường là 1 mặc dù nó có thể là bất kỳ giá trị thực nào. Một mô-đun có thể kết thúc bằng sai để chỉ báo lỗi nhưng điều này hiếm khi được sử dụng và thay vào đó sẽ chết() (thoát với lỗi).

nguồn: wiki

+6

Tôi đã thấy ''false';' được sử dụng trước như là giá trị thực ... :) – plusplus

+1

Dominus once [quipped] (http://groups.google.com/group/comp.lang.perl.misc/msg/a95715144dccec82?hl=en), “Tôi rất hiếm khi được sử dụng… [' 'Cogito ergo sum'; '] (http: // perl. plover.com/qotw/misc/r006/TestExpand.pm) mà mọi người đều biết là tự hiển nhiên trong tất cả các vũ trụ có thể. Điều này đảm bảo tính di động tối đa. ” –

+0

Điều này không trả lời câu hỏi: _why_ phải là một mô đun kết thúc bằng giá trị thực? – flies

7

Đó là bởi vì use Module LIST; tương đương với BEGIN { require Module; Module->import(LIST); } (xem perldoc -f use)

Riêng require Module; có thể được thực hiện với các bit mã sau đây (từ perldoc -f require):

sub require { 
    my ($filename) = @_; 
    if (exists $INC{$filename}) { 
    return 1 if $INC{$filename}; 
    die "Compilation failed in require"; 
    } 
    my ($realfilename,$result); 
    ITER: { 
    foreach $prefix (@INC) { 
     $realfilename = "$prefix/$filename"; 
     if (-f $realfilename) { 
     $INC{$filename} = $realfilename; 
     $result = do $realfilename; ## HERE 
     last ITER; 
     } 
    } 
    die "Can't find $filename in \@INC"; 
    } 
    if ([email protected]) { 
    $INC{$filename} = undef; 
    die [email protected]; 
    } elsif (!$result) { ## AND HERE 
    delete $INC{$filename}; 
    die "$filename did not return true value"; 
    } else { 
    return $result; 
    } 
} 

Xem số do $realfilename? Nhìn vào perldoc -f do, và bạn sẽ thấy rằng nó tương đương, khá nhiều, trong số eval system("cat $realfilename"), về cơ bản có nghĩa là slurp tệp và đánh giá nó.

Nhìn vào perldoc -f eval sản lượng: "Trong cả hai biểu mẫu, giá trị được trả về là giá trị của biểu thức cuối cùng được đánh giá bên trong chương trình mini". Đó là, câu lệnh cuối cùng trong tệp.

Đó là giá trị đề cập rằng nếu "tuyên bố" cuối cùng là một tuyên bố chương trình con, điều đó không phải là một giá trị đúng:

$ perl -le'$r = eval "sub a {1}"; print $r ? "true" : "false"' 
false 

Trong khi một 1; sau nó:

$ perl -le'$r = eval "sub a {1} 1"; print $r ? "true" : "false"' 
true 

Nhìn một lần nữa tại số sub require ở trên và với kiến ​​thức về những gì requiredo, số $result rằng trả lại do $realfilename thực sự là tuyên bố cuối cùng eval được chỉnh sửa từ tệp, đó thực sự là câu lệnh cuối cùng trong tệp.

Nếu tuyên bố cuối cùng không phải là giá trị thực, thì ## AND HEREelsif() Tôi đánh dấu sẽ được gọi và require sẽ chết vì mô-đun không trả về giá trị thực. Các use Module cũng sẽ chết, vì nó làm một require đằng sau hậu trường.

Ngắn câu chuyện dài, không quan trọng bạn kết thúc tệp nào, miễn là đó là giá trị được hiểu là true bởi perl. Các mẫu trên tự nhiên (CPAN) bao gồm 1;, mặc dù một số ngày này kết thúc tệp của chúng trong 1 (không có dấu chấm phẩy bị thiếu) và những người khác chỉ sử dụng các công cụ như '0 but true'; hoặc 'supercalifragilisticexpiralidous';, tất cả đều được phân tích là giá trị "lơ lửng" của Perl.

Hy vọng điều trên là sự hài lòng của bạn;)

Hacking vui vẻ!

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