我遇到了一些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?
答案 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 Foo
或require()
加载模块“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在全球范围内不可用吗?