# my @arr;
for (1..100)
{
for (1..100)
{
for (1..100)
{
push @arr, 1;
}
}
}
@arr
の有効範囲は?上のコメント行に宣言されているのと同じですか?宣言されていない変数はどのようなスコープでコードの深い部分に使用されていますか?
# my @arr;
for (1..100)
{
for (1..100)
{
for (1..100)
{
push @arr, 1;
}
}
}
@arr
の有効範囲は?上のコメント行に宣言されているのと同じですか?宣言されていない変数はどのようなスコープでコードの深い部分に使用されていますか?
は、パーサーが最初に遭遇したときに作成された後、パッケージ全体で表示されるグローバル変数です。
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)の場合、例えば '最初、見必ずしも使用されないときにそれを作成{印刷@arr;}'なります@main :: arr'をコンパイル時に作成します( 'no strict'と仮定します)。 – melpomene
@melpomene良い点、私はちょうど(別の小さな編集をしながら)それを変更すると考えています!問題は、 "_seen_"(コンパイラの "seeing"シンボルを参照して、私が絶対に明確だと思っていたもの)の使用について質問されています...今変更しました。ありがとうございます:) – zdim