- ベストアンサー
変数名をプログラム中で作成して値を取り出す方法
perlで変数名をプログラム中で作成して、その変数の値へアクセスする方法は、どのようにしたらよいのでしょうか? 例えば以下のスクリプトで、var_valueという変数名をプログラムで生成し、その値「12345」を取り出したい、というものです。 ================================ #! /usr/bin/perl $var_value ="12345"; $tmp1 = "var"; $tmp2 = "value"; $tmp3 = $tmp1."_".$tmp2; # $tmp3にvar_valueという文字列を作成 # print "tmp3 is $tmp3"; # 本当は$tmp3自体ではなく、$var_value=12345を取り出したい。。。 ================================ 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
シンボリックリファレンスというからくりを使えば可能です。 perlfaq7 - Perlに関することがら ($Revision: 1.28 $, $Date: 1999/05/23 20:36:18 $) http://perldoc.jp/docs/perl/5.6.1/perlfaq7.pod How can I use a variable as a variable name? (変数を変数名として使うにはどうすればいいですか?) 初心者はしばしば変数名が入った変数を使いたいと考えます。 $fred = 23; $varname = "fred"; ++$$varname; # $fred now 24 ―― ですが、上の引用部の続きにもあるようにシンボリックリファレンスを使うのはお奨めしません。 これは時には動作します。しかしこれは二つの理由により悪いアイデアです。 ―― 一つ目の理由は、このテクニックはグローバル変数でのみ動作するからです。つまり、もし上記の例において $fred が my() で作成されたレキシカル変数の場合、このコードは全く動作しません。プライベートなレキシカル変数を飛ばして、思いがけずグローバル変数にアクセスすることになります。グローバル変数は、簡単に衝突し、一般に拡張性がなく、混乱するコードを作ることになるので、よくないものです。
その他の回答 (2)
- arexis
- ベストアンサー率66% (66/99)
あれ? 最後の結果の部分ですが 「tmp3 is 12345」 と表示される事が目的なら $var_value ="12345"; $tmp1 = "var"; $tmp2 = "value"; $tmp3 = eval('$'.$tmp1."_".$tmp2); で。
お礼
有難うございます。 evalの使い方をマスタできました。 以上お礼遅れましたが、どうも有難うございました。
- kumoz
- ベストアンサー率64% (120/185)
少々トリッキーな方法です。 use strict; my $var_value = "12345"; my $tmp1 = "var"; my $tmp2 = "value"; my $tmp3 = $tmp1 . "_" . $tmp2; print "$tmp3 is @{[eval qq<\$$tmp3>]}\n";
お礼
お礼遅れました。 んー、ちょっと私には高級すぎで、、、 頭の片隅に止めさせていただきます。どうも有難うござました。
お礼
お礼遅れました。リンク先を参照してみました。 $$varname --> $fred --> "23"というなのだと理解しました。 また、この方法は被参照変数がGlobal変数の場合という注意事項も理解しました。 最後の手段ということで他の方法も検討してみることにします。 どうも有難うございました。