【问题标题】:Why does this Perl code use a 1; statement? [duplicate]为什么这个 Perl 代码使用 1;陈述? [复制]
【发布时间】:2010-09-19 21:50:11
【问题描述】:

可能重复:
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。结果看起来一样。

【问题讨论】:

标签: perl


【解决方案1】:

这是因为 Perl 模块必须返回“true”才能作为模块工作。如果一个模块没有返回 true,则认为它的初始化失败,相当于调用die。但是,如果代码不用作模块,则不需要,因此除非您尝试将代码示例也用作模块,否则您不会看到差异。

1; 可能只是返回 true 的最简洁的方法之一。

如果您查看this site,您会发现人们在返回值方面非常有创意。

【讨论】:

  • 好吧,除了0'0'undef''()('') 之外,基本上都是这样。
  • @Lazer : 即使'false' 也是真的。
【解决方案2】:

这是来自perldoc -f require的引用:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多