【问题标题】:What does "1;" mean in Perl?"1;" 是什么意思在 Perl 中是什么意思?
【发布时间】:2010-12-28 18:02:16
【问题描述】:

我遇到过一些类似于以下代码的 Perl 模块:

package MyPackage;

use strict;
use warnings;
use constant PERL510  => ( $] >= 5.0100 );

require Exporter;

our @ISA = qw(Exporter);  
our @EXPORT = qw( );

{  #What is the significance of this curly brace?

    my $somevar;

    sub Somesub {
      #Some code here 
    }
}

1;

1; 和包围 $somevar 和 Sub 的花括号有什么意义?

【问题讨论】:

标签: perl perl-module


【解决方案1】:

1 在模块末尾表示模块将true 返回到use/require 语句。它可以用来判断模块初始化是否成功。否则,use/require 将失败。

$somevar 是一个只能在块内部访问的变量。它用于模拟“静态”变量。从 Perl 5.10 开始,您可以使用关键字 state 关键字来获得相同的结果:

## Starting from Perl 5.10 you can specify "static" variables directly.
sub Somesub {
    state $somevar;
}

【讨论】:

  • 赞成,因为这个答案既简洁又正确,实际上回答了家长的所有问题。
【解决方案2】:

当您使用use Foorequire() 加载模块“Foo”时,perl 会像普通脚本一样执行Foo.pm 文件。如果模块被正确加载,它期望它返回一个真值。 1; 就是这样做的。也可以是2;"hey there";

$somevar 和函数Somesub 声明周围的块限制了变量的范围。这样,它只能从Somesub 访问,并且不会在每次调用Somesub 时被清除(如果它是在函数体内声明的情况下)。这个成语已被最新版本的 perl(5.10 及更高版本)取代,后者具有 state 关键字。

【讨论】:

    【解决方案3】:

    模块必须返回一个真值。 1 是一个真值。

    【讨论】:

      【解决方案4】:

      Perl 模块必须返回计算结果为 true 的内容。如果没有,Perl 会报告错误。

      C:\temp>cat MyTest.pm
      package MyTest;
      use strict;
      sub test { print "test\n"; }
      #1;  # commented out to show error
      
      C:\temp>perl -e "use MyTest"
      MyTest.pm did not return a true value at -e line 1.
      BEGIN failed--compilation aborted at -e line 1.
      
      C:\temp>
      

      虽然习惯上使用“1;”,但任何计算结果为 true 的都可以。

      C:\temp>cat MyTest.pm
      package MyTest;
      use strict;
      sub test { print "test\n"; }
      "false";
      
      C:\temp>perl -e "use MyTest"
      
      C:\temp>  (no error here)
      

      对于obvious reasons,另一个流行的返回值是42

      http://returnvalues.useperl.at/values.html 维护了一个很酷的返回值列表。

      【讨论】:

        【解决方案5】:

        花括号限制了局部变量 $somevar 的作用域:

        { 我的 $somevar; ... } # $somevar 的作用域到此结束

        【讨论】:

          【解决方案6】:

          来自require 的文档:

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

          【讨论】:

            【解决方案7】:

            我对 Perl 了解不多,但通常你使用花括号创建一个作用域。可能 $somevar 不应该在全球范围内可用?

            【讨论】:

              猜你喜欢
              • 2018-03-05
              • 2011-01-22
              • 2020-05-21
              • 1970-01-01
              • 2023-03-25
              • 1970-01-01
              • 2011-08-12
              • 2017-06-11
              • 2023-03-27
              相关资源
              最近更新 更多