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;

とSub1;を囲む中括弧との意味は何ですか?$somevar

4

7 に答える 7

68

1モジュールの終わりにあるということは、モジュールがステートメントに戻るtrueことを意味します。use/requireモジュールの初期化が成功したかどうかを確認するために使用できます。そうしuse/requireないと、失敗します。

$somevarブロック内でのみアクセス可能な変数です。「静的」変数をシミュレートするために使用されます。Perl 5.10以降では、keywordstateキーワードを使用して同じ結果を得ることができます。

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

モジュール「Foo」をuse Fooまたはでロードするとrequire()、perlはFoo.pm通常のスクリプトのようにファイルを実行します。モジュールが正しくロードされた場合、真の値を返すことを期待しています。それ1;をします。それはそうかもしれないし2;"hey there";同じように。

$somevarと関数の宣言の周りのブロックSomesubは、変数のスコープを制限します。このように、それはからのみアクセス可能でSomesubあり、の呼び出しごとにクリアされませんSomesub(これは、関数本体内で宣言された場合に当てはまります)。このイディオムは、 stateキーワードを持つ最近のバージョンのperl(5.10以降)で置き換えられました。

于 2009-12-21T13:57:33.470 に答える
8

モジュールは真の値を返す必要があります。1は真の値です。

于 2009-12-21T13:54:14.480 に答える
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)

明らかな理由で、もう1つの一般的な戻り値は42です。

http://returnvalues.useperl.at/values.htmlに維持されているクールな戻り値のリストがあります。

于 2009-12-21T13:59:20.993 に答える
4

requireのドキュメントから:

ファイルは、初期化コードが正常に実行されたことを示す最後のステートメントとしてtrueを返す必要があるため、このようなファイルは1で終了するのが通例です。それ以外の場合はtrueを返すことが確実でない限り。ただし、1を付けるだけの方がよいでしょう。、ステートメントを追加する場合。

于 2009-12-21T14:07:10.580 に答える
4

中括弧は、ローカル変数 $somevar のスコープを制限します。

{ 私の $somevar; ... } # $somevar のスコープはここで終了

于 2009-12-21T13:53:52.603 に答える
1

Perlについてはよくわかりませんが、通常は中括弧を使用してスコープを作成します。おそらく$somevarはグローバルに利用できないのでしょうか?

于 2009-12-21T13:54:52.577 に答える