• ベストアンサー

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

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を取り出したい。。。 ================================ 宜しくお願い致します。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

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

tk_1980024
質問者

お礼

お礼遅れました。リンク先を参照してみました。 $$varname --> $fred --> "23"というなのだと理解しました。 また、この方法は被参照変数がGlobal変数の場合という注意事項も理解しました。 最後の手段ということで他の方法も検討してみることにします。 どうも有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • arexis
  • ベストアンサー率66% (66/99)
回答No.3

あれ? 最後の結果の部分ですが 「tmp3 is 12345」 と表示される事が目的なら $var_value ="12345"; $tmp1 = "var"; $tmp2 = "value"; $tmp3 = eval('$'.$tmp1."_".$tmp2); で。

tk_1980024
質問者

お礼

有難うございます。 evalの使い方をマスタできました。 以上お礼遅れましたが、どうも有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

少々トリッキーな方法です。 use strict; my $var_value = "12345"; my $tmp1 = "var"; my $tmp2 = "value"; my $tmp3 = $tmp1 . "_" . $tmp2; print "$tmp3 is @{[eval qq<\$$tmp3>]}\n";

tk_1980024
質問者

お礼

お礼遅れました。 んー、ちょっと私には高級すぎで、、、 頭の片隅に止めさせていただきます。どうも有難うござました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プログラム名でプログラムが実行できない

    #!/usr/bin/perl # calc --計算式 print ("3 * 3 = "); print (3 * 2 ); print ("\n"); #改行 上記のような簡単なプログラムを作ってみました。 ところが、2段目にある「calc」と入力しても 「can not found」と出て実行してくれません。 保存したファイル名で「perl ファイル名」だときちんと実行してくれます。 どこがおかしいのでしょうか? やってみた事は ・which perl →/usr/bin/perl ・「chmod 775 ファイル名」   です。以上、よろしくお願いします。

    • ベストアンサー
    • Perl
  • DOSバッチで変数の値を変数名に設定したいのですが、可能でしょうか?

    DOSバッチで変数の値を変数名に設定したいのですが、可能でしょうか? 例として、以下のようにVARという変数に対して、ある文字列を設定し、その文字列の名前の変数の値を別の変数に代入したいのです。 set VAR="TMP" if /i "%VAR%"=="TMP" (SET TEST=%%VAR%%) echo %TEST% ここで求めている挙動は、SET TEST=%%VAR%%の命令によって SET TEST=%TMP% → SET TEST=C:\Windows\Temp のように展開されればいいのですが、実際はSET TEST=%VAR%となってしまいます。 なにか良い方法がないでしょうか?

  • javascriptで変数名

    javascriptで変数名を下記のような titleは同じでその後ろに1,2と生成する変数名を forなどで動的に生成するにはどうしたらいいのでしょうか。 生成した変数名に値を入れたいです。 var title1; var title2;

  • メインルーチンの変数をモジュールに渡す

    Perlの勉強をし始めの者なんで、恥ずかしい質問ですけど・・・ モジュールの使い方です。 以下のプログラムではTest_module.pmで定義した変数$testをメインルーチンでprintしています。 ***** メインルーチン *****  #perl /usr/bin/perl  use Test_module;  our $test=10;  print $Test_module::test; ***** Test_module.pm *****  package Test_module;  our $test=10;  1; これはちゃんと動いています。 ところが逆にメインルーチンで定義した変数$testをTest_module.pmに渡そうとすると、うまくいきません。 以下のプログラムをどう直せばいいのでしょうか。 ***** メインルーチン *****  #perl /usr/bin/perl  use Test_module;  our $test=10;  &Test_module::print_test(); ***** Test_module.pm *****  package Test_module;  sub print_test {  print $Main::test;  }  1;

    • ベストアンサー
    • Perl
  • perl スカラー変数の値をくっつける ストリング

    スカラー変数$valueの値が、 タイトル,名前,メールアドレス,コメント というストリングだったとします。 そのストリングの先頭に、 スカラー変数$cntの値(例えば数値の1)を挿入して、以下のようにしたいと思います。 1,タイトル,名前,メールアドレス,コメント この$valueと$cntをあわせたストリングを $allという変数に格納する場合、 $all=$cnt + "," + $value と書くのでいいのでしょうか? ちょっとActionScriptとごっちゃになっていて、 perlにおけるくっつけ方がわからなくなってしまっています。 お助けください。

    • ベストアンサー
    • CGI
  • 配列の値を可変変数を用いて取得する方法について

    配列の値を可変変数を用いて取得する方法について 下記のようなソースがあるのですが、$tmp1_1zのような変数の場合、可変変数を用い取得する事は出来たのですが、$hairetsu["tmp2_1z"]のような配列の場合、可変変数を用い取得する事は出来ませんでした。 どちらの例の場合も、$varの中には意図した文字が取得できていると思うのですが、$$varの結果が異なり、どのように記述すれば配列の場合も可変変数の値が取得できるか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 【ソース】 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>title</title> </head> <body> <?php $tmp1_1z = 1; $hairetsu["tmp2_1z"] = 2; $i = 1; $var = 'tmp1_' . $i . 'z'; echo "<p>var=" . $var . "</p>"; echo $tmp1_1z; // 下記は値が取得できます。 echo "<p>\$var=" . $$var . "</p>"; $var = 'hairetsu["tmp2_' . $i . 'z"]'; echo "<p>var=" . $var . "</p>"; echo $hairetsu["tmp2_1z"]; // 下記は値が取得できません。 echo "<p>\$var=" . $$var . "</p>"; ?> </body> </html> 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • シェル変数(path)の挙動がわかりません

    シェル変数の挙動がわからなくて困っています。 以下のような3ファイルがあります。 % cat /tmp/test_config.sh #!/opt/local/bin/zsh path=($path /tmp) % cat /tmp/test.sh #!/opt/local/bin/zsh . /tmp/test_config.sh echo $PATH echo $path /tmp/test2.sh % cat /tmp/test2.sh #!/opt/local/bin/zsh echo $PATH echo $path which test.sh これを、所有者のユーザで実行するのとsu -c で実行するので挙動が変わります。 % /tmp/test.sh /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/tmp /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/local/bin /opt/local/sbin /tmp /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/tmp /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/local/bin /opt/local/sbin /tmp /tmp/test.sh % sudo su - hogehoge -c /tmp/test.sh /bin:/usr/bin:/usr/ucb:/usr/local/bin:/tmp /bin /usr/bin /usr/ucb /usr/local/bin /tmp /bin:/usr/bin:/usr/ucb:/usr/local/bin /bin /usr/bin /usr/ucb /usr/local/bin test.sh not found この挙動の違いは、何から産まれるんでしょう? .zshrc でそういう設定ができるんでしょうか? .zshenv は使ってません。 (なお、環境変数$PATHを使えば目的は果たせると言うのはわかっています)

  • 受け取った変数がファイルに書き込めない

    Perlで質問があります。 Perlでフォームから受け取った変数の値($title = “333”)を別にCGI 投げます。Printでは問題なく変数の中身が表示されるのですが Txtに書き込もうとするとうまくいきません。 ちなみに行頭で$title = “333”;すると書き込めます。 うまく受け渡しができていないのでしょうか? 以下ソースです。 #!/usr/bin/perl -w require 'lib.pl'; #########i一応lib.plの中身######### $q = new CGI; $q->charset('EUC-JP'); print $q->header; $title = $q->param('title'); ################################## use CGI; my $fname = 'news.txt'; open(FILE, ">>$fname") or die; print FILE $title ; close(FILE);

  • 変数に値を引き渡すについて

    Win2000、JavaScript です。 入力フォームでチェックボックスがあります。 現在は... ------------------------- <script language="javascript"> <!--// var strSelectValue; function SetValueC2(objCheck) { strSelectValue = objCheck.value; } //--> </script> <BODY> <FORM METHOD="POST" NAME="MainForm"> <input type="checkbox" name="C2" value="1" onclick="SetValueC2(this)"> ------------------------- のように、同じフォーム上で チェックがされたら SetValueC2() へ 値 "1" を引き渡して、 変数 strSelectValue に値を入れています。 それを、 同じフォーム上ではなく function SetValueC2(objCheck) { strSelectValue = objCheck.value; } の部分を別ファイル(.js)へ引き渡ししたいのですが、 引き渡し方がわかりません。 多分 onclick="SetValueC2(this) の部分が違うと思うのですが... どなたか教えてください 宜しくお願いします。

  • 変数など厳密なプログラムが書きたいのですが、どうすればよいでしょうか?

    PHPで関数の引数に渡すとき、以下のように$aaを$aとしてしまった場合に 関数内の$idは値がありませんが、関数内でこれを検出することができるのでしょうか? Perlなら use strict;とし、my等で定義されていない変数はすべて警告表示されますが、PHPはスルーです。 変数など厳密なプログラムが書きたいのですが、どうすればよいでしょうか? $aa = 1; test($a) function test($id){ ... }

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • 専業主婦の心ない暴言が男女平等を妨げ、DV(家庭内暴力)につながる可能性がある。
  • 夫たちの労働や苦労を無視し、仕事と育児を平等に分担すべきであることを訴える。
  • 専業主婦や兼業主婦に対する偏見や差別的な言葉も存在し、社会の課題となっている。
回答を見る

専門家に質問してみよう