メインモジュールの局所変数
特に指定がない限り,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です.