レキシカルスコープのローカル編素を宣言する
my
は、囲われているブロックに指定の変数を(レキシカルに)局所化します。
2 つ以上の変数を引き渡すなら、そのリストはカッコで囲まなければいけません。
{
my $str; # 変数宣言だけして初期値なし (undef)
my $name = 'Taro'; # 変数宣言と同時に初期値を代入
my ( $o1, $o2 ); # 複数の変数宣言だけして初期値なし (それぞれに undef)
my ( $p1, $p2 ) = ( 1, 2 ); # 複数の変数宣言と初期値代入を同時に行う
# 以上の変数は、このブロックが抜けたら消滅する
}
print $name, "\n"; # 前述の $name とは全く別物のため Taro にはならない
カッコで囲んだ場合、ダミーのプレースホルダーとして undef
を使うことができます。
たとえば、最初の値だけ初期値の代入をスキップしたいなら、次のように書くことができます。
my ( undef, $min, $hour ) = localtime;
同じスコープの中で同名の変数を再宣言すると、最初の宣言をシャドーイングします。
つまり、新たなインスタンスを生成し、最初の変数の値にアクセスできないようにします。
通常はこの挙動は歓迎されるものではないため、警告が有効 (use warnings;
など) なら、
警告が発せられます。
なお、この警告のカテゴリーは
shadow
です。
use warnings;
my $name = 'Taro';
my $name = 'Jiro';
このスクリプトを実行すると、次のような警告が出力されます。
"my" variable $name masks earlier declaration in same scope at sample.pl line 5.
TYPE と ATTRS についての詳細は perlsub の "Private Variables via my()" を参照してください。