こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

変数名をプログラム中で作成して値を取り出す方法

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を取り出したい。。。
================================

宜しくお願い致します。

投稿日時 - 2008-01-14 12:49:53

QNo.3678808

困ってます

質問者が選んだベストアンサー

シンボリックリファレンスというからくりを使えば可能です。
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() で作成されたレキシカル変数の場合、このコードは全く動作しません。プライベートなレキシカル変数を飛ばして、思いがけずグローバル変数にアクセスすることになります。グローバル変数は、簡単に衝突し、一般に拡張性がなく、混乱するコードを作ることになるので、よくないものです。

投稿日時 - 2008-01-14 13:08:59

お礼

お礼遅れました。リンク先を参照してみました。
$$varname --> $fred --> "23"というなのだと理解しました。
また、この方法は被参照変数がGlobal変数の場合という注意事項も理解しました。


最後の手段ということで他の方法も検討してみることにします。
どうも有難うございました。

投稿日時 - 2008-01-19 03:12:43

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

あれ?

最後の結果の部分ですが

「tmp3 is 12345」
と表示される事が目的なら

$var_value ="12345";

$tmp1 = "var";
$tmp2 = "value";
$tmp3 = eval('$'.$tmp1."_".$tmp2);

で。

投稿日時 - 2008-01-17 22:32:38

お礼

有難うございます。
evalの使い方をマスタできました。

以上お礼遅れましたが、どうも有難うございました。

投稿日時 - 2008-01-29 20:59:55

ANo.2

少々トリッキーな方法です。

use strict;
my $var_value = "12345";
my $tmp1 = "var";
my $tmp2 = "value";
my $tmp3 = $tmp1 . "_" . $tmp2;
print "$tmp3 is @{[eval qq<\$$tmp3>]}\n";

投稿日時 - 2008-01-14 17:11:47

お礼

お礼遅れました。
んー、ちょっと私には高級すぎで、、、

頭の片隅に止めさせていただきます。どうも有難うござました。

投稿日時 - 2008-01-29 20:58:27

あなたにオススメの質問