畑です。

# googleからだと文字化けしてうまく投稿出来ませんでした。:(

jun@nih.go.jp wrote:
> 以下のコードを実行すると、$a,$b,$cに何も代入されないのですが、
> myを削除するとうまくいきます。どうしてなのでしょうか?
> 
> 
> $data = "1 2 3";
> $cmd = 'my($a,$b,$c)=split(/\s/,$data);';
> eval $cmd;
> print "$a $b $c\n";

このコードはもう少し整理して書くと

eval { my($a, $b, $c) = split / /, '1 2 3'; };
print $a, $b, $c, "\n";

と等価だと思います。

myは変数をそのスコープ( {} で囲まれたブロック)の内側に
特殊化する(レキシカル変数にする)宣言ですから、このeval
ブロックの内側と外側の $a, $b, $c はそれぞれ別個の変数と
して扱われることになります。
つまり、print文の結果は、未定義の $a, $b, $c に対してな
されることになります。

$a, $b, $c のmy宣言と、evalブロックでの代入を両方やりたい
場合は、

my($a, $b, $c);
eval { ($a, $b, $c) = split / /, '1 2 3'; };
print $a, $b, $c, "\n";

とするのがいいと思います。

-- 
Masanori HATA