- ベストアンサー
連想配列をリターン値として返す方法
ご協力をお願いいたします。 <私の考え>を記載しましたが、上手く動作しませんでした。 何が間違っているのか、ご指摘をお願いいたします。 質問は、2件あります。 (1)連想配列の2次元について 例えば、以下の様なデータを持っている場合、 連想配列では、どの様に定義したらよいですか? <データ> |*name|*tel| |moo |012 | |aiai |235 | <私の考え> %data; $data[0]{"name"} = "moo"; $data[0]{"tel"} = "012"; $data[1]{"aiai"} = "moo"; $data[2]{"235"} = "012"; (2)上記の様なデータをサブルーチンの返り値として渡すには? <私の考え> sub.pl(パッケージ) sub data { %data; $data[0]{"name"} = "moo"; $data[0]{"tel"} = "012"; $data[1]{"aiai"} = "moo"; $data[2]{"235"} = "012"; return(%data); } main.pl(サブルーチンを呼び出しているファイル) %data = data(); print "$data[0]->{name}\n" print "$data[0]->{tel}\n"
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず, $data[0]{name} みたいにアクセスするんだったら, 普通の配列なので @data を使うことに注意. 連想配列だと $data{あれ}{name} のようなアクセス方法ですね. data の直後のかっこが違います. で |*name|*tel| |moo |012 | |aiai |235 | というデータを @data に入れるなら $data[0]{name} = "moo"; $data[0]{tel} = "012"; $data[1]{name} = "aiai"; $data[1]{tel} = "235"; かなぁ? 実は name がユニークなキーになっているので連想配列 %data を使って $data{moo} = "012"; $data{aiai} = "235"; で十分かもしれないとか, データが重複するけど $data{moo}{name} = "moo"; $data{moo}{tel} = "012"; $data{aiai}{name} = "aiai"; $data{aiai}{tel} = "235"; の方が便利かもしれないとか, いろいろ想像はできますが. で, こいつをサブルーチンから返すには, 配列なら return @data; 連想配列なら return %data; となります. 受け取る方は @data = data(); なり %data = data(); なりで受け取れば OK.
その他の回答 (1)
- rafysta
- ベストアンサー率45% (24/53)
ANo.1さんと、ほとんど同じですが・・、少しだけ付け足し。 $data[2]{name} = "nao"; と書いてもいいけど、1個ずついちいち書くのは面倒だから、 my @data = ( {"name" => "moo","tel" => '012'}, {"name" => "aiai","tel" => '235'} ); と書くことの方が多いと思う。 ちなみに、これは、 my %data1 = ("name" => "moo","tel" => '012'); my %data2 = ("name" => "aiai","tel" => '235'); my @data = (\%data1, \%data2); とほぼ同じ意味。 sub.pl sub data{ my @data = ( {"name" => "moo","tel" => '012'}, {"name" => "aiai","tel" => '235'} ); return @data; } main.pl my @data = data(); print $data[0]->{name}, "\n"; print $data[0]->{tel}, "\n";
お礼
rafysta様、Tacosan様 ご回答、ありがとうございました。 ご協力を頂いた結果、課題をクリアする事ができました。 結果として、@dataのパターンを使う事にしました。 『教えて、!Goo』を初めて使ったのですが、これで皆様にお礼の言葉が届いたか心配です。