• ベストアンサー

構造体の配列の指定方法

use Class::Struct; struct command => [ my @pppoe = (command->new( name => 'pppoe1', com1 => 'pppoe1 -m', com2 => 'pppoe1 -c',), command->new( name => 'pppoe2', com1 => 'pppoe2 -m', com2 => 'pppoe2 -c',)) という風な定義になっているときに、 print ${"pppoe"}[0]->name; というような指定はできないでしょうか? 配列名を入れた配列@a=("pppoe")などで動的に していしたいためですが。だめなら他の方法は ないでしょうか?

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#myをやめる use Class::Struct; struct Command => [ name => '$', com1 => '$', com2 => '$', ]; @pppoe = ( Command->new( name => 'pppoe1', com1 => 'pppoe1 -m', com2 => 'pppoe1 -c'), Command->new( name => 'pppoe2', com1 => 'pppoe2 -m', com2 => 'pppoe2 -c',)); print ${"pppoe"}[0]->name;

tamukikun
質問者

補足

回答ありがとうございます。 ところでなぜmyをはずすとうまくいくのでしょうか?

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

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>なぜmyをはずすとうまくいくのでしょうか? Perlの実装者じゃないんで本当の所はよくわかりませんが、 多分、名前の管理をするところが異なるためだと思います。 私も、どちらかというと普通にリファレンスを使った方が良いと思います。

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

リファレンスを使ったほうがスマートだと思います。 @a = (\@pppoe); print $a[0][0]->name; ハッシュを使った場合。こちらのほうがよりベター? my %arrayHash = (pppoe => \@pppoe); print $arrayHash{pppoe}[0]->name; # もちろんハッシュのキーは文字列変数で指定できる my $key = "pppoe"; print $arrayHash{$pppoe}[0]->name; どうしてもリファレンスを使いたくなかったらevalで。 my $arrayName = "pppoe"; eval("print \${$arrayName}[0]->name;");

全文を見る
すると、全ての回答が全文表示されます。
  • okiyoshi
  • ベストアンサー率34% (11/32)
回答No.1

# 邪道のシンボリックリファレンスを使って、、 no strict; @a = qw( a1 a2 ); @a1 = ( 1, 2, 3 ); @a2 = qw( a b c ); print ${$a[0]}[2], "\n"; print ${$a[1]}[1], "\n";

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

関連するQ&A

  • Perl構造体、出力方法

    struct command => [ name => '$', com1 => '$', com2 => '$', ]; @pppoe = (command->new( name => "pppoe1", com1 => "pppoe1 -m", com2 => "pppoe1 -c",), command->new( name => "pppoe2", com1 => "pppoe2 -m", com2 => "pppoe2 -c",)) とあるときに、 print @pppoe->name; としたいのですが、うまくいきません。 いい方法を教えてください。

    • ベストアンサー
    • Perl
  • データ数の多い構造体配列について

    visual c++で配列をメンバーに持つ構造体配列を定義したいと思っています。 しかし、以下のように定義してもプログラムが実行されません。 配列の容量が大きいのかもしれませんが、 大量のデータを扱いたいので容量を小さくはしたくありません。 大量のデータを扱うのに何かいい方法はないでしょうか。 struct X { double A[1000]; }; : : : struct X B[10000];

  • 構造 他のクラスの構造体を別のクラスで使いたい。

    C#で以下のようにCls1で定義している構造体をCls2の引数に使いたいのですが 定義されていないエラーになります。 Cls2で再定義すると、同じものが2つできて修正するときに困りそうです。 プログラムの構造について、何か良い方法がありましたら教えてください。 namespace A { class Cls1 { public struct Kumi { public string name; public int age; } private test(){ Kumi k; k.name = "太郎"; k.age = 5; Cls2 c2 = new Cls2(); c2.Write(k); } } } 別のクラスファイル namespace A { class Cls2 { public Write(Kumi k){ } } }

  • C#で構造体配列

    C#で構造体配列の操作練習?をしているのですが using System; using System.Collections.Generic; using System.Text; namespace test1 { public struct Data { public string name; // 名前 public uint value; // 値 } class read { Data[] human = new Data[300]; public static string idSearch() { for (int i = 0; i < 300; i++) { if (test1.read.human[i].value == 25) return test1.read.human[i].name; } } } } だと エラー CS0120: 静的でないフィールド、メソッド、またはプロパティ 'test1.read.human' で、オブジェクト参照が必要です。 と言うエラーが出るのですが、どうしてでしょうか?

  • 構造体とポインタ配列

    現在C言語の勉強をしております。 環境はwindowsXP、コンパイラはVC6.0です。 構造体と、ポインタの配列についてなのですが、 以下のような構造体が宣言されている時に、リスト構造にデータがいくつか入っているとします。 // 構造体 typedef struct address { unsigned char names[NAME_SIZE+1]; /* 名前 */ char tels[TEL_SIZE + 1]; /* 電話番号 */ struct address *prev; /* 前へのポインタ */ struct address *next; /* 次へのポインタ */ }Address, *a_pt; そのリスト構造を先頭要素か順番にポインタ配列に格納するには以下の方法ではおかしいでしょうか? /* ポインタ配列を用意する */ Address *array[MAX_COUNT]; /* top_ptは先頭のポインタです */ pt = top_pt; /* データがなくなるまで配列へ格納する */ while(pt != NULL){ array[count++] = pt; pt = pt->next; } /* 配列の最後はNULLとする */ array[count] = NULL; また、配列の中身を確認する方法としては、 printf("配列の中身:%s\n", array[0]->names); では、アドレスが表示されてしまうのかな・・と思ったら、accessViolationで落ちてしまいました・・・。 中身はどうしたらデバッグ出来ますでしょうか? そもそも、以下の2つは何か違いはありますか? Address *ptA[100]; a_pt ptB[100]; 皆さん、どうかよろしくお願いいたします。 理解不能な場合はご指摘ください。

  • perl の複雑(?)なクラス定義(データ構造)

    以下のようなクラスを作成したいのですが、どのようにクラスとして定義して、どのように呼び出せばよいのでしょうか。特に「score」の部分の記述方法が良く分かりません。 オブジェクト指向(とくにPerl)はあまり経験がない初心者です。 -------------------- データ構造 name addr score--+-- math +-- english +-- science -------------------- クラス記述 package myClass; $ref_score->{math} = '30'; # <-- 正しい? $ref_score->{english} = '40'; # <-- 正しい? # ... sub new { my $class = shift; my $self={}; $self->{name} = 'tanaka'; $self->{addr} = 'tokyo'; $self->{score} = $ref_score; # <-- 正しい? bless $self, $class; } -------------------- メイン文 package main; $inst[0] = myClass::new(); $inst[0]->{name} = "OVERWRITE_NAME"; $inst[0]->{score}->{math} = "OVERWRITE_SCORE_MATH"; print $inst[0]->{module}."\n"; # 出る print $inst[0]->{score}->{math}."\n"; # オーバーライトした値は出るが... print $inst[0]->{score}->{english}."\n"; # 初期値のままの値は表示してくれない... 宜しくお願いいたします。

  • 構造体で・・・・

    構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • C#の構造体に関して

    C#の構造体に関して C#で構造体で配列を持ちたいと思い、宣言の仕方や使い方を 勉強していますが、どうしてもコンパイルは通るもののエラーと なってしまいます。 《ソース》 単純に構造体で宣言した"a"という配列に、"ABC"という文字列を 代入したいだけですが。。。 namespace テスト環境 { struct test { public string []a; } class Program { static void Main(string[] args) { test aaa = new test(); aaa.a[0] = "ABC"; } } } 配列の初期化等は、ようやく理解したつもりではいますが、構造体 が絡むとどうしてもわかりません。 どこをどのように修正したら良いかを教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。

  • C言語 構造体配列について

    6人分の小テストの点数を記録し,平均値などを計算するプログラムを作成している. 以下の手順と条件に従ってプログラムを作成. 手順 (1) 氏名(name[100], char 型) と点数( score , int 型) をメンバにもつ構造体「struct_TEST」を(main 関数の外で)定義. (2) struct _TEST 型構造体配列 element[6] を定義. (3) キーボードから氏名(ローマ字でよい)と点数を入力する処理を6 回繰り返す. (4) 平均点を計算して画面表示. (5) 最高点を出した人の名前と点数を画面表示. (6) 平均点に満たない人の名前と点数を画面表示. 条件 (3)~(6)の処理には以下に示す関数を利用する. (3) ・・・ 氏名と点数を入力する処理をn 回繰り返す関数 void input_score( struct _TEST *a, int n ) (4) ・・・ n 個の構造体配列に対して平均を計算し,平均点を返す関数 double calc_ave( struct _TEST *a, int n ) (5) ・・・ n 個の構造体配列に対して最高点を算出し,そのユーザの配列番号を返す関数 int calc_max( struct _TEST *a, int n ) (6) ・・・ n 個の構造体配列に対して平均点に満たない人の名前と点数を画面表示する関数 void show_under_ave( struct _TEST *a, int n ) C言語の構造体が良く分かっていません。 こういった条件が多いと考えづらく分からなくなります。 考えても分かっていないので困っています。 誰かすみませんが解答を教えて下さい。