如果你不放1,会发生什么?在包裹的最后?

时间:2017-01-27 06:54:51

标签: perl

如果您未将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;会发生什么。

2 个答案:

答案 0 :(得分:6)

这有点棘手。如果包裹将由userequire加载,则只需要它。

来自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