那是因为use Module 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;
}
}
Run Code Online (Sandbox Code Playgroud)
看到了do $realfilename吗?看看perldoc -f do,你会发现它几乎就是等价的eval system("cat $realfilename"),这基本上意味着将文件放入其中,然后评估它.
查看perldoc -f eval产生:"在两种形式中,返回的值是在迷你程序中评估的最后一个表达式的值 ".也就是说,文件中的最后一个语句.
值得一提的是,如果最后一个"语句"是子例程声明,那么它不构成真正的值:
$ perl -le'$r = eval "sub a {1}"; print $r ? "true" : "false"'
false
Run Code Online (Sandbox Code Playgroud)
而它1;之后:
$ perl -le'$r = eval "sub a {1} 1"; print $r ? "true" : "false"'
true
Run Code Online (Sandbox Code Playgroud)
在再次寻找sub require以上,并与什么样的知识require和do确实的$result是,do $realfilename回报确实是最后一条语句eval从文件,这确实是文件中的最后一条语句编辑.
如果这样的最后一个语句不是真值,## AND HERE elsif()则会突出显示我突出显示的内容,并且require当模块没有返回真值时它会死掉.该use Module也必死无疑,因为它是做require幕后.
简而言之,只要它是一个被trueperl 理解为的值,那么你对文件的结尾并不重要.上野(CPAN)样品包括1;,但也有一些这些天,而结束自己的文件1(没有缺少分号),和其他人只是古怪使用的东西一样'0 but true';或者'supercalifragilisticexpiralidous';,所有这些分析为被Perl"truish"的价值观.
希望以上是令您满意的;)
快乐的黑客!