为什么这个Perl代码使用1;声明?

时间:2010-09-19 13:28:59

标签: perl

  

可能重复:
  Why do you have to put a 1; at the end of a Perl 5 module?

在此页Perl::Critic::Policy::Subroutines::RequireFinalReturn中,这是一个代码示例

package Password;
# every time the user guesses the password wrong, its value
# is rotated by one character
my $password;
sub set_password {
    $password = shift;
}
sub check_password {
    my $guess = shift;
    if ($guess eq $password) {
        unlock_secrets();
    } else {
        $password = (substr $password, 1).(substr $password, 0, 1);
    }
}
1;
  • 为什么最后使用1;?该语句对编译器有何意义?

我尝试了代码withwithout。结果看起来一样。

2 个答案:

答案 0 :(得分:7)

这是因为Perl模块必须返回“true”才能使其作为模块运行。如果模块没有返回true,则假定它的初始化失败,它等同于调用die。但是,如果代码不用作模块,则不需要,因此,除非您尝试将代码示例用作模块,否则您将看不到差异。

1;可能只是回归真实的最简洁方法之一。

如果你看一下this site,就会发现人们的回报值很有创意。

答案 1 :(得分:4)

以下是perldoc -f require的引用:

  

该文件必须返回true作为最后一个   声明表明成功   执行任何初始化代码,   所以习惯上结束这样的文件   用1;除非你确定它   否则返回true。但它更好   只是把1; ,如果你添加   更多陈述。

如果我从模块中删除1;,然后在另一个脚本中尝试use,我会收到编译错误:

Password.pm did not return a true value
BEGIN failed--compilation aborted