メインモジュールの局所変数
特に指定がない限り,Perlの変数は大域変数です.メインモジュール・サブモジュール,ブロックの内・外の区別なしに定義した変数を書き換えることが可能です.
sub f0{ $hoge=1; #サブモジュールでメインモジュールの変数を書換え. print "in sub f0: $hoge\n"; } $hoge=0; #大域変数. print "before sub: $hoge\n"; f0; print "after sub: $hoge\n"; #実行結果 bash-2.05$ perl sam.pl before sub: 0 in sub f0: 1 #←サブモジュールで変数を書き換えると, after sub: 1 #←メインモジュールの変数も書き換わる.
サブモジュールで使う変数にmyを指定してレキシカル変数にすると,局所変数とすることができます.
sub f0{ my $hoge=1; #サブプログラムの局所変数. print "in sub f0: $hoge\n"; } $hoge=0; #大域変数. print "before sub: $hoge\n"; f0; print "after sub: $hoge\n"; #実行結果 bash-2.05$ perl sam2.pl before sub: 0 in sub f1: 1 after sub: 0
サブモジュールの変数は外部から隠すことができました.しかし,メインモジュールの変数は大域変数のままで外部から丸見えです.どこかのサブモジュールで変えようと思えばいくらでも変えることができます.メインモジュール内の局所変数を定義したいものです.
メインモジュール内の局所変数を定義するには,メインモジュールで使う変数にもキーワードmyを指定します.
sub f0{ $hoge=1; #大域変数$hogeに1を代入. print "in sub f0: $hoge\n"; } sub f1{ my $hoge=1; #サブプログラムの局所変数$hogeに1を代入. print "in sub f1: $hoge\n"; } $hoge=0; #大域変数$hogeに0を代入. print "before sub: $hoge\n"; f0; #このサブモジュールの中で大域変数を0から1に書き換え. print "after sub: $hoge\n"; print "\n"; $hoge=0; #再び大域変数$hogeに0を代入. print "before sub: $hoge\n"; f1; print "after sub: $hoge\n"; print "\n"; my $hoge=0; #メインプログラムの局所変数$hogeに0を代入. print "before sub: $hoge\n"; f0; #このサブモジュールの中で大域変数を0から1に書き換え. print "after sub: $hoge\n"; #このサブモジュールの中で大域変数$hogeを0から1に書き換えても,メインモジュールの局所変数$hogeには影響なし. #実行結果 bash-2.05$ perl sam3.pl before sub: 0 in sub f0: 1 after sub: 1 before sub: 0 in sub f1: 1 after sub: 0 before sub: 0 in sub f0: 1 after sub: 0
動作環境は,WindowsNT Workstation 4.0+SP6,cygwin 1.3.3,perl 5.6.1,bash 2.05です.