Perl のスカラー・リファレンスの怪

おもしろいことに今頃気がついたので、とりあえずメモ。

スカラー変数を、そのスカラーへのリファレンスへすげかえると、おもしろいことが生じます。別の変数になら期待した通りの結果になります。

Perl の変数は束縛変数ではなく、オブジェクトがむき出しで顔を覗かせているようなものと考えれば、理解できないこともないですが、私には新鮮な結果でした。

$ perl -v

This is perl 5, version 16, subversion 3 (v5.16.3) built for i686-linux

$ perl -E 'my $a = "abc"; $a = \$a; say ${$a}'
REF(0x9c6d9a0)
$ perl -E 'use Devel::Peek; my $a = "abc"; $a = \$a; print Dump($r)'
SV = NULL(0x0) at 0x87ee9e8
  REFCNT = 1
  FLAGS = ()
$ perl -E 'my $a = "abc"; my $r = \$a; say ${$r}'
abc
$ perl -E 'use Devel::Peek; my $a = "abc"; my $r = \$a; print Dump($r)'
SV = IV(0x84bf9ac) at 0x84bf9b0
  REFCNT = 1
  FLAGS = (PADMY,ROK)
  RV = 0x84bf9f0
  SV = PV(0x84ad048) at 0x84bf9f0
    REFCNT = 2
    FLAGS = (PADMY,POK,pPOK)
    PV = 0x84ba5e0 "abc"\0
    CUR = 3
    LEN = 12