为什么所有Perl 5模块都必须以1;
结尾?
答案 0 :(得分:23)
Perl模块必须以true值结束,否则认为不是 装了。按照惯例,这个值通常是1,尽管它可以 任何真正的价值。模块可以以false结尾以指示失败但是 这很少使用,它会改为die()(退出时出错)。
来源:wiki
答案 1 :(得分:7)
那是因为use Module LIST;
相当于BEGIN { require Module; Module->import( LIST ); }
(见perldoc -f use)
特别是,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';
或{{1}这样的东西所有这些都被Perl解析为“truish”值。
希望以上是令您满意的;)
快乐的黑客攻击!