{ my $var; # $var } # $var
これについて何が面白いですか?
当初から、Perlはこれを間違っていました。 デフォルトでは、Perl 5の変数のスコープはモジュール変数であり、グローバル変数のようなものです。 ブロック内で何かを定義すると、外部から見えるようになります。
$ perl -v This is perl 5, version 12, subversion 1 (v5.12.1) $ perl -E '{ $var = 42 }; say $var' 42 $ perl -wE '{ my $var= 42 }; say $var' Name "main::var" used only once: possible typo at -e line 1. Use of uninitialized value $var in say at -e line 1.
Perl 6では、デフォルトで字句変数が機能します。
$ perl6 -e '{ $var = 42 }; say $var' # 'my' ===SORRY!=== Symbol '$var' not predeclared in <anonymous> $ perl6 -e '{ my $var = 42 }; say $var' # – ===SORRY!=== Symbol '$var' not predeclared in <anonymous>
まあ、それはタイプミスをキャッチするのに役立つかもしれません...しかし、これの主な利点は、変数の正直な範囲で作業することです。 これにより、プログラムの複雑さを管理できます。
もちろん、Perl 5は「正しく」プログラムすることを強制せず、厳格な警告を使用しませんでした。 Perl 5は後方互換性を提供することを約束しましたが、Perl 1は明らかに複雑なプログラムを書くことを意図していませんでした。 小さなスクリプトのグローバル変数は理にかなっています。
Perl 6は、小規模な作業を開始し、プログラムの成長に合わせて構造化されたサポートを追加しようとしています。 変数の場合、これは、スクリプトとモジュールではデフォルトで変数が字句であることを意味しますが、–eで呼び出される単一行のファイルでは、グローバル変数が残ります。
レキシカル変数についてのすべてがそうではないと思ったら。 このアプローチには予期しないボーナスがあります。 機能を考えてみましょう:
sub counter($start_value) { my $count = $start_value; return { $count++ }; }
コードブロックが返されます。 カウンターが呼び出されるたびに、何度も呼び出すことができるコードを取得します。
このコードの2つの異なる部分を作成し、それらを操作すると、次のようになります。
my $c1 = counter(5); say $c1(); # 5 say $c1(); # 6 my $c2 = counter(42); say $c2(); # 42 say $c1(); # 7 say $c2(); # 43
ほら $ c1と$ c2は独立して機能します。 各状態は、変数$ countの形式で保存されます。 私たちにとっては、1つの変数のように見えるかもしれませんが、2つの異なるカウンターインスタンスの場合、これらは2つの異なる値のストレージエリアです。 このようなブロックはクロージャーと呼ばれます。
クロージャーが軽量オブジェクトに似ていると思われる場合-おめでとうございます、まさにそうです。 アクセス制限の本質は、TOEでの情報のカプセル化と非表示の本質と同じです。 プログラムの特定の部分ができる限り少なくできるように、これはすべて、アクティビティのフィールドを制限するために必要です。