以下の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