3/28 の記事で何気なく「Perl だったら良かったんだけどね」と書いてから、気になって検証してみた。
#!perl
my $i;
$i = \1; # read-only
${$i}++; # Error!
この例では $i = \1 がリテラルへのリファレンスで read-only だから参照だけする分には問題ないものの、次の行でデリファレンスした値の操作がエラーとなる。
#!perl
my $i;
$$i = 1;
${$i}++; # OK!
ところがこちらのコードだとデリファレンス値の変更も OK だ。なんとなく判ってはいても説明するのは厄介だし、それが正しい Perl の仕様なのかと訊かれると困ってしまう。
→ 山口家の逆襲->perl-解説->リファレンス生成->暗黙のリファレンス生成
二番目の例は「無名スカラー値」と言えるかもしれない。
#!perl
my $i;
{
my $a = 1;
$i = \$a;
}
${$i}++;
こちらの記述であれば間違いない。このように局所変数をスコープ外から参照することは C/C++ では誤りだが、Perl では正しいコードだ。「実用 Perl プログラミング」の「1.2.3 無名のメモリ領域へのリファレンス」に説明がある。
# Perl4 ではどーだとかの話はしない。
「Perlでは何が定数なのか」 - D-6 [相変わらず根性無し] Daisuke Maki さん Posted by masato at 09:13 PM
おそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。