以下のPerlコードがあります。
use warnings;
use strict;
my $x = "global\n";
sub a {
print $x;
}
sub b {
local $x = "local\n";
a();
}
a();
b();
a();
$x が b() サブルーチン内にスコープを持っていても、なぜ Perl はそれをローカライズできないのですか?
以下のPerlコードがあります。
use warnings;
use strict;
my $x = "global\n";
sub a {
print $x;
}
sub b {
local $x = "local\n";
a();
}
a();
b();
a();
$x が b() サブルーチン内にスコープを持っていても、なぜ Perl はそれをローカライズできないのですか?
my
で使用されるレキシカル スコープと、パッケージ変数の名前空間付きグローバル スコープを混在させることはできません(キーワードlocal
は、後者でのみ使用できます)。Perl は$x
、一度定義すると、ソース内でレキシカル スコープの変数として扱います。パッケージ変数には ( を使用して) アクセスできますが、$::x
これは 2 つの完全に別個の変数が使用されていることを意味し、$x
.
our
の代わりに使用することで、やろうとしているように見えるものと非常によく似たものを実現できますmy
。
our $x = "global\n";
このour
キーワードは、パッケージ変数へのレキシカル スコープのエイリアスを作成します。
出力は次のとおりです。
global
local
global