• ベストアンサー

変数名を配列として利用するには?

複数のモジュールに記述されている配列を1つの配列へ代入したいと思っています。 単純に考えれば、 @array = (@Module1::array, @Module2::array, @Module3::array); で良いのですが、モジュールが多岐に渡っており、モジュール名自体はスカラー変数へ代入して置き、それを利用したいと考えています。 @array = (); foreach $m (qw(Module1 Module2 Module3)) { $mn = $m. '::array'; foreach $w (@{$mn}) { # @Module1::array にアクセスしているつもり push(@array, $w); } } この様なイメージです。 しかし、@{$mn}は Can't use string ("変数名") as an ARRAY ref while "strict refs" in use at 行番号. になってしまいます。 スカラー文字列に入っている配列変数へアクセスするにはどう記述すれば良いでしょうか?

  • u1kb
  • お礼率100% (2/2)
  • Perl
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

テストしていないので自信はないのですが、配列名を文字列として組み立てて eval するとうまくいくのではないかと思います。 > foreach $w (@{$mn}) { # この行を、下のように変更する foreach $w (eval('@' . $mn)) {

u1kb
質問者

お礼

kumoz さん 素直にevalで囲ってしまう。と言う手もありますね。 コードも分かりやすいし、保守性を確保する上でも良い方法ですね! この方法を採用させて頂きたいと思います。 ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

一応 2通りほど考えてみました: 1. あっさりあきらめてその部分だけ no strict; する 2. パッケージのシンボルテーブルを使って大技で: パッケージ Module1 のシンボルテーブルは $::{'Module1::'} で参照できます. この中から配列 array のデータを取り出せばよいので, @Module1::array は @{$::{'Module1::'}{array}} によっても参照できます. ということで foreach $m (qw(Module1 Module2 Module3)) { push @array, @{$::{$m . '::'}{array}}; } でよいのではないかと. ちなみに配列全体をまとめて push できます.

u1kb
質問者

お礼

Tacosan さん > 1. あっさりあきらめてその部分だけ no strict; する 一瞬諦めかけました(^^;) > 2. パッケージのシンボルテーブルを使って大技で: > パッケージ Module1 のシンボルテーブルは $::{'Module1::'} で参照できます. この中から配列 array のデータを取り出せばよいので, > @Module1::array は @{$::{'Module1::'}{array}} によっても参照できます. あぁ~ なるほど!確かにその通りですね。そこまで気が回りませんでした。 ありがとうございました。

関連するQ&A

  • 変数名(配列)の中の変数

    配列変数の名前の中に変数を入れたい場合、どのように記述すればいいのでしょうか? use strictを用いて、以下のように書いてみましたが、エラーが出て上手く動きません。 ループ x: 1-3 ループ y: 1-2 ${"answer$x"[$y]}=入力値 ←この部分を教えてください。    ループ閉 y ループ閉 x --------------------     answer1[1] answer1[2] answer2[1] answer2[2] answer3[1] answer3[2] とループを通るように、変数名を設定したいのですが、 エラーが出て実行ができません。 エラー:Can't use string ("answer1") as an ARRAY ref while "strict refs" in use at~ -------------------- 実際のプログラムは以下のように書いています。(該当部分のみ) for(my $x=1; $x<$num; $x++) { for (my $y=0; $y<$n; $y++) { my $y = ($x*$n)+$d; my @line = split(/\r/, $data[$y]); my @line0 = split(/\t/, $line[0]); ${"answer$x"[$y]} = $line0[0]; } } よろしくお願いします。

  • 配列の操作に関して

    perlプログラミング初心者です。 質問なのですが、ある配列array1に関して foreach(@array1){ ・・・・・・ } という操作をしています。この操作を@arrray2,@array3,@array4に関して、ループを使って行いたいのですがどのようにすればよいのでしょうか。配列の配列を作って @Array = qw/ @array1 @array2 @array3 @array4/; として foreach構文を使うと、@array1が展開されずに処理できませんし・・ 初歩的なことだと思いますがアドバイスお願いします。

    • ベストアンサー
    • Perl
  • 3次元配列

    初歩的な質問で申し訳ございません、非常に困っています 教えて下さい lotno(1~4,1~4,1~5) の3次元配列を宣言し、計算で求められた値を代入したいのですが どのように記述したらいいのでしょうか? また配列 lotno() はモジュール変数です

  • ポインター変数名と配列名は同じでよいのでしょうか?

    C言語で int *data; data[0]=0x15; という記述を見ました。 私にはdataはポインター変数名 であり配列名に思えます。 (ポインター変数へポインター定数を代入するには data = data; ???) しかし入門書にはこんな例はありませんでした。 私の解釈とはちがった意味があるのでしょうか? 教えてください。

  • 変数名の連結

    以下のような配列があるとします。 $str[0] = aaa; $str[1] = bbb; $str[2] = ccc; foreachでまわし変数名を連結し代入するというような事は可能なの でしょうか? foreach ($str as $key => $val) { //$keyをechoすると012と表示 //ここで変数名を$data0,$data1のようにしたいがうまくいかない $data . $key = $val; //配列にするぶんには正常に動作しました $data[$key] = $val; }

    • ベストアンサー
    • PHP
  • 配列型の宣言?

    こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){  $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 多次元配列?配列のキー?変数の型?

    PHP勉強中のものです。 予定通りの動作にならんく四苦八苦しています。 どのように修正すれば予定通りになるのか考え方のアドバイスなどお願いします。 処理したいこと 変数$xxxの先頭の文字と最後の文字をsubstr()で取り出し$aaaと$bbbに別けそれぞれ代入しキーとして多次元配列に代入した配列要素を指定してechoで出力したい 試してみたこと $aaa1と$bbb1に直接整数を代入してみたところ、echoで出力された キーになる変数を整数型として変数に代入してみたが希望通りの動作にならなかった。 なにかアドバイス頂けると助かります。 $array = array( "0" =>array("あいうえお","かきくけこ"), "1" =>array("さしすせそ") ); $xxx = "0-1"; $aaa = substr($xxx,0,1); $bbb = substr($xxx,2); $aaa = (int)$aaa; $bbb = (int)$bbb; echo $array[$aaa][$bbb]; //出力されない $aaa1 = 0; $bbb1 = 1; echo $array[$aaa1][$bbb1]; //出力された $aaa = (int)$aaa; $bbb = (int)$bbb; echo $array[$aaa][$bbb]; //出力されない

    • ベストアンサー
    • PHP
  • 配列の記述

    配列@arrayの中からある特定の順番の配列を取得したいです。 $array[1]の1について$nなどの変数を使いたいのですが、 []の中に変数をどう記述すればいいのでしょうか? $n=100; print "$array["."$n"."]"; print '$'."array["."$n"."]"; ???わからない???

  • 参照変数の親配列を取得

    データの多次元配列があって、値に応じて動的に関数を選択し 中身の値を引数で渡すみたいな感じの処理をしています ほとんどの処理は中身の値だけあれば事足りるのですが 稀にキー値を使いたい処理がでてきます 本当に稀なので引数にキー値も渡すようにするのは 無駄が多くなるように思うので避けたく できれば参照変数で渡される値から 親配列でのキー値を取得したいと思っています $arr2A=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2B=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2C=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); foreach($arr2A as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2B as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2C as $key=>$val){ $fncs[$val['fnc']]($val); } $fncs=array( A=>function(&$arr){ }, B=>function(&$arr){ }, C=>function(&$arr){ //ここで稀にキー値も使いたい }); 実際のコードはかなり長いので載せられませんが 要約すると上記のような感じの処理です まずどのデータ配列の集合から渡されたのかが明確ではありませんので indexOfなどでキー値を得るのというのが難しいです 現在は、その処理が必要なデータ行について処理前に 中身にキー値をあらかじめ入れてしまう というように対応しているので、一応解決はしているのですが もし参照変数から親配列を得る方法が あればと思い質問させていただきました ”そんなものはない”という回答も あきらめつくのでお願いします

    • ベストアンサー
    • PHP
  • 2次元配列の宣言について

    文字列の配列の場合 Dim m As Variant Dim moji As String m=Array("aa","bb","cc","dd",・・・) moji=m(1) とすれば"bb"がmojiに代入されるのはわかるのですが これを二次元配列(3行4列)にする場合どのように 宣言(Dim~や、Array~)等はどのように記述すればよろしいですか? 基本的な質問でごめんなさい。 よろしくお願いします。

専門家に質問してみよう