[英]Why do you have to put a 1; at the end of a Perl 5 module?
為什么所有Perl 5模塊都必須以1;
結尾1;
?
Perl模塊必須以true值結束,否則認為它沒有加載。 按照慣例,這個值通常為1,盡管它可以是任何真值。 模塊可以以false結尾以指示失敗,但這很少使用,而是die()(退出時出錯)。
來源: 維基
那是因為use Module LIST;
相當於BEGIN { require Module; Module->import( LIST ); }
BEGIN { require Module; Module->import( LIST ); }
BEGIN { require Module; Module->import( LIST ); }
(參見perldoc -f使用 )
特別是require Module;
可以使用以下代碼實現(來自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 ($@) {
$INC{$filename} = undef;
die $@;
} elsif (!$result) { ## AND HERE
delete $INC{$filename};
die "$filename did not return true value";
} else {
return $result;
}
}
看到do $realfilename
嗎? 看看perldoc -f do ,你會發現它幾乎與eval system("cat $realfilename")
,這基本上意味着將文件放入其中並對其進行評估。
查看perldoc -f eval產生:“在兩種形式中,返回的值是在迷你程序中評估的最后一個表達式的值 ”。 也就是說,文件中的最后一個語句。
值得一提的是,如果最后一個“語句”是子例程聲明,那么它不構成真正的值:
$ perl -le'$r = eval "sub a {1}"; print $r ? "true" : "false"'
false
而1;
之后:
$ perl -le'$r = eval "sub a {1} 1"; print $r ? "true" : "false"'
true
在再次尋找sub require
之上,並與什么樣的知識require
和do
那樣,在$result
是, do $realfilename
回報確實是最后一條語句eval
從文件,這確實是文件中的最后一條語句編輯。
如果這樣的最后一個語句不是真值,那么我將調用我突出顯示的## AND HERE
elsif()
,並且由於模塊沒有返回真值,所以require
將會死亡。 use Module
也會死,因為它在幕后做了一個require
。
簡而言之,只要它是一個被perl理解為true
值,那么你對文件的結束並不重要。 野外樣本(CPAN)包括1;
雖然有些人現在寧願結束他們的文件1
(沒有丟失的分號),而其他人只是奇怪地使用像'0 but true';
這樣'0 but true';
東西'0 but true';
或'supercalifragilisticexpiralidous';
,所有這些都被Perl解析為“truish”值。
希望以上是令您滿意的;)
快樂的黑客!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.