web-dev-qa-db-ja.com

「1;」とはPerlで意味しますか?

たとえば、次のコードに似た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とサブを囲む中括弧の重要性は何ですか?

33
Anand Shah

モジュールの最後にある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;
}
66
Ivan Nevostruev

モジュール「Foo」を_use Foo_またはrequire()でロードすると、Perlは通常のスクリプトのように_Foo.pm_ファイルを実行します。モジュールが正しくロードされた場合、真の値を返すことを期待しています。 _1;_はそれを行います。 _2;_または_"hey there";_の場合もあります。

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

11
tsee

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)

明らかな理由 別の一般的な戻り値は42です。

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

8
Ed Guiness

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

8
Quentin

require のドキュメントから:

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

4
toolic

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

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

4
Pim

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

1
eWolf