use strict; use warnings; package FOO; my $hoge = "madoka"; package BAR; my $moge = "homura"; package BAZ; print "\$FOO::hoge : $FOO::hoge \n"; print "\$hoge : $hoge \n"; print "\$BAR::moge : $BAR::moge \n"; print "\$moge : $moge \n"; ------------------ 実行結果 $FOO::hoge : # エラー $hoge : madoka # 期待と違ってエラーじゃない $BAR::moge : # エラー $moge : homura # 期待と違ってエラーじゃない Name "BAR::moge" used only once: possible typo at - line 12. Name "FOO::hoge" used only once: possible typo at - line 10.この場合 $hoge も $moge もレキシカル変数なので
外から見えないことを期待しましたが、なぜか見えます。
では、次の場合はどうでしょう?
use strict; use warnings; package FOO; my $hoge = "madoka"; package BAR; my $moge = "homura"; package BAZ; my $hoge = "mami"; my $moge = "sayaka"; ------------------ 実行結果 "my" variable $hoge masks earlier declaration in same scope at - line 11. "my" variable $moge masks earlier declaration in same scope at - line 12.「$hoge も $moge も同じスコープで既に使われてるよ」と怒られます。
PACKAGE が違ってもレキシカル変数は同じスコープみたいです。
これはこれで不便なので期待通りに動かすには次のようにします。
package FOO; { my $hoge = "madoka"; }もしくは
{ package FOO; my $hoge = "madoka"; }このように明示的にブロックで囲みます。
これを踏まえて書き直すと
use strict; use warnings; package FOO; { my $hoge = "madoka"; print "\$hoge : $hoge \n\n"; } package BAR; { my $moge = "homura"; print "\$moge : $moge \n\n"; } package BAZ; { my $hoge = "mami"; my $moge = "sayaka"; print "\$hoge : $hoge \n"; print "\$moge : $moge \n"; } ------------------ 実行結果 $hoge : madoka $moge : homura $hoge : mami $moge : sayakaめでたし、めでたし。
- 追記 -
perlのドキュメントに書いてありました。
perlmod - Perl のモジュール (パッケージとシンボルテーブル) 【perldoc.jp】
パッケージ文は(local() を使った)動的変数にのみ効果を持ちますが、
my() によって生成されたレキシカル変数には影響しません。
0 コメント:
コメントを投稿