シンボリックリファレンス

まずは普段あまり使わないシンボリックリファレンスについて勉強しようと思います。
最近ところどころでシンボリックリファレンスを見かけるようになったので、
今回ちょっと勉強しなおして曖昧な部分を払拭しようかなと思っています。
とりあえずは簡単なメモ程度

※シンボリックリファレンスはグローバル変数を対象としている為ローカル変数では使えない。

$hensuu = "city";
$hoge = \$hensuu;
#これは普通に$hensuuのリファレンスを変数に入れたものをデリファレンスしている
print $$hoge."\n"; #city

シンボリックリファレンスの処理手順は、

  1. $hensuuがリファレンス変数かをみる
  2. そうでない場合は値が文字列かをチェックし文字列だと変数名とみなす

(ちなみに、$hensuuが数字だった場合は、「Modification of a read-only value attempted」というエラーになる)
となっている。

$city = 10;
$$hensuu = 30; #$hensuuは"city"が入っているので、$cityの値が上書きされる。
print $city."\n"; #30

配列もハッシュも同様に使える

#配列として評価する。
@$hensuu = (1,2,3,4,5);
map { print $_ } @city; #12345

#ハッシュとして評価する。
%$hensuu = ("hp"=>"orz","mp"=>"!!");
map { print $$hensuu{$_} } keys %city; #orz!!

変数の値がたまたま違う変数名と一致してシンボリックリンクリファレンスとなってしまうのを回避したいとき

use strict 'refs'; #指定するとシンボリックリファレンスを使うとエラーにすることが出来る。
$var = "x";
print $$var = 30; #Can't use string ("x") as a SCALAR ref while "strict refs" in use at test.pl line 260.

use strict;とかでシンボリックリファレンスが禁止されている中で部分的に使用したい場合

no strict 'refs'; #無効にする。
$var = "x";
print $$var = 30; #30