36

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

包围 the和 Sub1;的花括号的意义是什么?$somevar

4

7 回答 7

68

1在一个模块的末尾意味着该模块返回trueuse/require语句。它可以用来判断模块初始化是否成功。否则,use/require将失败。

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

## Starting from Perl 5.10 you can specify "static" variables directly.
sub Somesub {
    state $somevar;
}
于 2009-12-21T13:57:33.977 回答
11

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

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

于 2009-12-21T13:57:33.470 回答
8

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

于 2009-12-21T13:54:14.480 回答
8

Perl 模块必须返回一些计算结果为真的东西。如果没有,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;”,但任何评估为真的东西都可以工作。

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)

出于显而易见的原因,另一个流行的返回值是42

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

于 2009-12-21T13:59:20.993 回答
4

花括号限制了局部变量 $somevar 的范围:

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

于 2009-12-21T13:53:52.603 回答
4

要求的文档中:

该文件必须返回 true 作为最后一条语句,以指示任何初始化代码的成功执行,因此习惯上以 1 结束此类文件;除非你确定它会返回 true 否则。但最好只放 1; ,以防您添加更多语句。

于 2009-12-21T14:07:10.580 回答
1

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

于 2009-12-21T13:54:52.577 回答