Perl には 2 種類の変数スコープがあります。
- グローバル変数: それらは現在のパッケージに存在し、外部からアクセスでき、「ローカル」値を持つことができます。この名前は、パッケージ変数のハッシュ/シンボル テーブルである「stash」のキーとして使用できます。
- レキシカル変数: それらは現在のスコープに存在します (大まかに中括弧で区切られています)。検査できるシンボルテーブルがありません。
レキシカル変数とグローバル変数は干渉しません。同じ名前の 2 つの異なる変数が存在する可能性があります。
ほとんどの Perl 変数マジックは、グローバル変数で発生します。次の構文は、グローバル変数で機能します。
our $var;
$::var;
$main::var;
${'var'};
local $var;
しかしそうではありませんmy $var
。
したがって、次のように記述できます。
@::array = qw(a b c);
my @secondArray = @{array};
配列をコピーします。変数に格納されている名前で配列を検索することもできます。
@::array = qw(a b c);
my $name = "array";
my @secondArray = @{$name};
最後の行は に省略され… = @$name
ます。
レキシカル変数はスタッシュに存在しないため、これは不可能です。
このlocal
関数は、現在のスコープ内およびこのスコープ内から呼び出されるすべてのサブルーチンのスコープ (「動的スコープ」) 内のグローバル変数 (およびグローバルのみ) に「ローカル」値を割り当てます。
もともと (Perl 4 では) 参照をシミュレートする唯一の方法は、変数名と stash をいじることでした。これらの使用法は、参考文献が利用可能であるため、現在ではほとんどが 20 年ほど時代遅れになっています (はるかに安全です)。