知ってる人には当然のことかも知れないが、
案外盲点だったので記録しておく。
タイトルにあるようにPerlにおいて、変数名を変数で指定する方法である。
よくわからないと思うので、具体的な例で説明しよう。
例えば引数などで外部CGIプログラムに値を引き渡す場合、
よく使われるのが「&」や「=」で変数名と値を結合して渡す方法だ。
受けて側ではforeach関数などで繰り返し処理をしながら、
split関数で再び変数名と値に分けたりするのが一般的だろう。
この場合、連想配列(ハッシュ)として取得するのではあれば話は簡単だ。
($key, $value) = split(/=/, $str)のように
$keyと$valueに分けておいて、$str{"$key"} = $valueとでもしてやれば良い。
これで$str{変数名} = 値という図式が完成する。
ところが、$keyをそのままスカラー変数名として使用しようとすると頭を悩ますことになる。
当然、$key = $valueでは$keyに値が格納されるだけで、
$keyの値をスカラー変数名として取得することはできない。
もちろん、一つ一つスカラー変数に格納していけばプログラム的には何ら問題はないのだが、
せっかく変数名とセットで送っているのに、これでは面倒だ。
実はこのような場合、簡単に$keyの値を変数名にする方法がある。
それには${$key} = $valueとしてやれば良い。
これは、スカラー変数も実体はキーのないハッシュであることを利用している。
というわけで、これを応用するとループ処理で$iを加算しながら
${'number'.$i} = $iのようにすれば、
$number1 = 1
$number2 = 2
$number3 = 3...
といったスカラー変数を簡単に作ることが可能だ。