質問

私はいくつかの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とサブを囲む中括弧の意味は何ですか?

役に立ちましたか?

解決

モジュールの終わりに

1モジュールの戻りステートメントをtrueするuse/requireことを意味します。モジュールの初期化が成功した場合に通知するために使用することができます。それ以外の場合は、use/requireは失敗します。

$somevarは、ブロック内のアクセス可能な変数です。 「静的」変数をシミュレートするために使用されます。あなたは同じ結果を持っているキーワード state のキーワードを使用することができたPerl 5.10から開始します:

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

他のヒント

あなたがuse Fooまたはrequire()でモジュール「foo」をロードすると

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

$somevarの宣言と機能Somesub周りのブロックは、変数のスコープを制限します。そうすれば、それはSomesubからのみアクセス可能であると(それは関数本体内で宣言された場合はケースになり)Somesubを呼び出すたびにクリアされません。このイディオムは、状態を持っているのperlの最近のバージョン(5.10以上)に取って代わられましたキーワードます。

モジュールは、真の値を返すことがあります。 1が真の値である。

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;」。、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)

は、別の人気戻り値の明白な理由があるの 42 の。

http://returnvalues.useperl.at/valuesに維持クールな戻り値のリストがあります。 HTML のます。

中括弧は、ローカル変数$ SOMEVARの範囲を限定ます:

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

の必要のためのドキュメントから:

  

ファイルが最後にtrueを返す必要があります。   文の成功を示すために   任意の初期化コードの実行、   それは、このようなファイルを終了するのが通例です   1と;あなたは確信している場合を除き、それはよ   そうでない場合はtrueを返します。しかし、それは良いでしょう   ちょうど1を配置します。 、場合にあなたが追加します   複数の文ます。

私は、Perlについて多くを知らないが、通常、あなたは、中括弧を使用してスコープを作成します。おそらく$ SOMEVARは、グローバルに利用できるようにshoudln't?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top