什么是“1;” Perl意味着什么?

时间:2009-12-21 13:48:14

标签: perl perl-module

我遇到了一些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?

的花括号有什么意义?

7 个答案:

答案 0 :(得分:66)

模块末尾的

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;
}

答案 1 :(得分:11)

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

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

答案 2 :(得分:8)

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

答案 3 :(得分:8)

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维护了一个很酷的返回值列表。

答案 4 :(得分:4)

花括号限制局部变量$ somevar:

的范围

{   我的$ somevar; ... }#$ somevar的范围在这里结束

答案 5 :(得分:4)

来自require的文档:

  

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

答案 6 :(得分:1)

我对Perl知之甚少,但通常使用花括号创建一个范围。可能$ somevar在全球范围内不可用吗?