2017-02-15 3 views

答えて

8

は、パーサーが最初に遭遇したときに作成された後、パッケージ全体で表示されるグローバル変数です。

use warnings; 
#use strict; 

for (1..3) { 
    #my @arr; 
    for (1..3) { 
     push @arr, $_; 
    } 
} 

print "@arr\n"; 

それは彼らがコード全体「放射」という、

 
1 2 3 1 2 3 1 2 3 

これはグローバル悪口の一つである印刷されます。 use strict;

strictは単に宣言を強制しているので、我々は

 
Possible unintended interpolation of @arr in string at scope.pl line 11. 
Global symbol "@arr" requires explicit package name at scope.pl line 7. 
Global symbol "@arr" requires explicit package name at scope.pl line 11. 
Execution of scope.pl aborted due to compilation errors. 

を得る有効に、これは有意義@arrが(したがって、コードの至る所で見られる)グローバルであることを私たちに通知します。

ここで宣言すると同じ効果がありますが、宣言されていないグローバル変数と同じではありません。 A my変数はレキシカルでスコープがあり、最も近い囲みブロックです。 my

からmyローカル(字句)囲んでいるブロック、ファイル、またはevalになるようにリストされた変数を宣言する。複数の変数がリストされている場合、リストはかっこ内に置く必要があります。

また、字句はシンボルテーブルにありません。

したがって、最初のループ(コメントアウトされた行)内で宣言されると、最後には表示されません(ループのブロックの外側には存在しません)。最後の行は、そこに作成されたグローバル@arrを参照しています。私たちは、一度使用、空のmain::arrに関する警告

 
Possible unintended interpolation of @arr in string at scope.pl line 11. 
Name "main::arr" used only once: possible typo at scope.pl line 11. 

を得るか、そしてそれ以来、空行が印刷されます。

は「*それが最初に使用されるときに作成*」もPrivate variables via my() in perlsub

+0

見る - 技術的パーサは、それが((0)の場合、例えば '最初、見必ずしも使用されないときにそれを作成{印刷@arr;}'なります@main :: arr'をコンパイル時に作成します( 'no strict'と仮定します)。 – melpomene

+0

@melpomene良い点、私はちょうど(別の小さな編集をしながら)それを変更すると考えています!問題は、 "_seen_"(コンパイラの "seeing"シンボルを参照して、私が絶対に明確だと思っていたもの)の使用について質問されています...今変更しました。ありがとうございます:) – zdim

関連する問題