メインモジュールの局所変数

特に指定がない限り,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です.