如果您未将1;
放在包裹的末尾会发生什么?例如,如果我从以下脚本中删除1;
,则代码仍会运行:
#!/usr/bin/perl
package Foo;
print "Begin and Block Demo\n";
BEGIN {
print "This is BEGIN Block\n"
}
END {
print "This is END Block\n"
}
1;
创建包是否必须1;
?我看到this question,但它没有解释如果省略1;
会发生什么。
答案 0 :(得分:6)
这有点棘手。如果包裹将由use
或require
加载,则只需要它。
来自require
该文件必须返回true作为最后一条语句,表示成功执行任何初始化代码,因此通常会使用
1;
结束此类文件,除非您确定它已经确定了#{1}}。否则将返回true。但是如果添加更多语句,最好只放1;
。
use归结为require
,因此每当use
模块时,返回的最后一个语句必须返回true,否则编译失败。确保这一点的一个简单方法是将1;
放在最后。如果您从未use
(或require
)打包,那么您不必拥有1
(true)。
通过use
带入程序的文件中的代码实际运行,并且必须按照require
的要求最终返回true。如果以另一种方式读入文件,则不会返回' return'。
如果它作为可执行文件运行,那么再次没有要求真正的返回,因为require
不涉及。但是,我们通常会编写包以便use
它们,而不是将它们作为程序运行。实际上,最后始终应该是1;
。
perlmod也需要阅读。
这是一个简单的例子。这个
档案 Mod.pm
package Mod;
# print "hello\n"; # works with this line uncommented
文件 script.pl
use Mod;
由perl script.pl
打印
Mod.pm did not return a true value at main.pl line 1. BEGIN failed--compilation aborted at main.pl line 1.
当包use
时,必须返回真值。如果最后一次返回来自一个恰好返回true的语句,就像注释掉print
一样,那么一切都很好。
但我们可以运行perl Mod.pm
,无论它返回什么。
答案 1 :(得分:3)
当您use
.pm
文件时,该文件必须返回一个真值(例如1
)以表示成功,否则use
语句将失败,编译将被中止。
但是,包装本身不必以真正的价值结束;通常每个包都在自己的.pm
文件中,文件需要1
才能成为use
能力。在您的示例中,将包直接放在可执行脚本中,不需要1
。