my(=局所変数)スコープ内でのみ利用できてスコープを抜けた所(リファレンスがなくなったところ?)で破棄される。
local(=退避変数)宣言があった所で値を退避させてスコープを抜けた所でもとに戻す。
って感じで説明するかなぁ
以下のコード実行結果予想して、実際に実行してあってれば理解できるんじゃないかな
use strict;
use warnings;
my $a = 1;
local $b = 1;
my $c = undef;
if(1){
my $a = 'a'; local $b = 'a';
$c = sub {
printf "%d:a=%s,b=%s\n",1,$a++,$b++;
};
printf "%d:a=%s,b=%s\n",2,$a++,$b++;
}
printf "%d:a=%s,b=%s\n",3,$a++,$b++;
$c->();
printf "%d:a=%s,b=%s\n",4,$a++,$b++;

局所化できない変数($_等)除くと、よっぽど特別な理由がなきゃmyでいいじゃんって思う