- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:パッケージ内のグローバル変数)
パッケージ内のグローバル変数について
このQ&Aのポイント
- Perlでパッケージ内に作成したグローバル変数について、外部からの参照とmy宣言による制限について理解できません。
- パッケージ内のグローバル変数を完全修飾名で外部から参照することはできますが、my宣言によりスコープが限定されたグローバル変数にはアクセスできません。
- グローバル変数を作成したパッケージ内では、my宣言により作成された変数は外部から参照することができません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
my による変数は、基本的にスコープの外側から見ることができません。 参照を返すような関数で参照を渡してやればアクセス可能だと思います。 例: sub test { my $test_v = 10;# 関数の中の変数、通常外からアクセスできない。 return \$test_v;# 参照を返す } $v = test(); print $$v,"\n";# 参照を使って読み出す $$v += 10; # 値の変更をする print $$v; >参照できない理由は…という理解でよいのでしょうか? perl の実装に詳しくないので判定できかねます。 (単にスタック上にあるのではないのは確かです、特別に名前の管理をしているように思えます)
お礼
ご回答ありがとうございます。 リファレンスを得れば、外部から見えるんですね。 おっしゃるとおり示していただいた例だとsub test 内のスコープを抜けてからも $test_v が参照できて いるので、単純にスタック上などでないのが明白ですね。 分かりやすいコードまで示していただいてありがとう ございます。 その後、らくだ頭本など調べ直してみたのですが、 「パッケージ・名前空間」のところに「my変数は 特別な場所におかれる」とありました。すなわち mainやその他のパッケージとは別の場所に置かれる ようです。 疑問が解けてすっきりしました。