my

レキシカルスコープのローカル編素を宣言する

構文

解説

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.

TYPEATTRS についての詳細は perlsub の "Private Variables via my()" を参照してください。