複数のモジュールに記述されている配列を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 行番号.
になってしまいます。
スカラー文字列に入っている配列変数へアクセスするにはどう記述すれば良いでしょうか?
No.2ベストアンサー
- 回答日時:
テストしていないので自信はないのですが、配列名を文字列として組み立てて eval
するとうまくいくのではないかと思います。
> foreach $w (@{$mn}) { # この行を、下のように変更する
foreach $w (eval('@' . $mn)) {
kumoz さん
素直にevalで囲ってしまう。と言う手もありますね。
コードも分かりやすいし、保守性を確保する上でも良い方法ですね!
この方法を採用させて頂きたいと思います。
ありがとうございました。
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 できます.
Tacosan さん
> 1. あっさりあきらめてその部分だけ no strict; する
一瞬諦めかけました(^^;)
> 2. パッケージのシンボルテーブルを使って大技で:
> パッケージ Module1 のシンボルテーブルは $::{'Module1::'} で参照できます. この中から配列 array のデータを取り出せばよいので, > @Module1::array は @{$::{'Module1::'}{array}} によっても参照できます.
あぁ~ なるほど!確かにその通りですね。そこまで気が回りませんでした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロ Publicでの配列定義
-
perl 初等プログラミングについて
-
MATLABの関数で配列の要素を返...
-
リストボックスに縦スクロール...
-
Excel VBA ユーザーフォームの...
-
二次元配列のインデックスについて
-
VB6で配列の最大値を簡単に求め...
-
エクセルVBAでTransposeの不思議
-
grepを利用して、特定の要素が...
-
フローチャートを教えてください
-
UWSCの終了の仕方
-
VBのReturnの使い方
-
VBAでの一時停止と再開の方法
-
ループフリー
-
Escキーを押すと、中断する時と...
-
画面を強制的に再描画させる方法
-
まったく同じファイルのハッシ...
-
配列に格納した文字列の置換
-
チェックデジットについて
-
短いハッシュの作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
Excel VBA ユーザーフォームの...
-
クラスに配列を渡す方法
-
リストボックスに縦スクロール...
-
エクセルVBAでTransposeの不思議
-
Strawberry Perl for Windows ...
-
Dim flag(4) as boolean で配列...
-
二次元配列における要素数のは...
-
マクロ Publicでの配列定義
-
二次元配列のインデックスについて
-
perl 初等プログラミングについて
-
文字の整列(printf)
-
grepを利用して、特定の要素が...
-
参照配列の要素数の求め方は?
-
配列へのプラス?
-
フローチャートを教えてください
-
複数の配列の全ての組み合わせ...
-
VB6で配列の最大値を簡単に求め...
-
複数のキーで配列をソートする...
-
delphi の 標準偏差のプログラ...
おすすめ情報