Re: my in eval
畑です。
# 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
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735