my

myは、レキシカル変数の宣言時に使う。

my - レキシカル変数の宣言 - Perlプログラミング入門ゼミ - Perlでテキスト処理・Linuxサーバー管理・Webシステム開発

型のある言語でいうところのローカル変数宣言である。
基本的にPerlの場合、変数を宣言しなくても、勝手に変数を生成して値を割り当てるのだが、myを使うのと使わないのではちょっと意味合いが変わってくる。
使わない場合、

$var1 = 1; # $var1を1で初期化.
print '$var1 = '."$var1\n"; # $var1を出力.
{
  print '$var1 = '."$var1\n"; # $var1を出力.
  $var1 = 2; # $var1に2を代入.
  print '$var1 = '."$var1\n"; # $var1を出力.
  {
    $var1 = 3; # $var1に3を代入.
    print '$var1 = '."$var1\n"; # $var1を出力.
    $var1 = 4; # $var1に4を代入.
    print '$var1 = '."$var1\n"; # $var1を出力.
  }
  print '$var1 = '."$var1\n"; # $var1を出力.
}
print '$var1 = '."$var1\n"; # $var1を出力.

こういうコードに対して、

[bg1@dti-vps-srv93 ~]$ vi my.pl
[bg1@dti-vps-srv93 ~]$ perl my.pl
$var1 = 1
$var1 = 1
$var1 = 2
$var1 = 3
$var1 = 4
$var1 = 4
$var1 = 4
[bg1@dti-vps-srv93 ~]$

こういう結果になる。
$var1は一番上の外側の時点で生成される。
ブロックを抜けても中での代入がそのまま外の変数に反映される。
ブロック内で別の変数名とすれば、外から参照できないわけだけど。

myを使って、

一番外と、一番中の下のほうでmyで宣言してる。
こうすると、

[bg1@dti-vps-srv93 my]$ vi my.pl
[bg1@dti-vps-srv93 my]$ perl my.pl
$var1 = 1
$var1 = 1
$var1 = 2
$var1 = 3
$var1 = 4
$var1 = 3
$var1 = 3
[bg1@dti-vps-srv93 my]$

こうなる。
一番中でmy宣言した初期値4の$var1は、ブロックを抜けると参照できなくなる。
その前に一番中で3を代入された$var1は、もともと一番外側で宣言された変数を中で参照しているものなので、以降はその値が出力されている。

Sample/perl/my/my/src/my at master · bg1bgst333/Sample · GitHub