• ベストアンサー

連想配列をリターン値として返す方法

ご協力をお願いいたします。 <私の考え>を記載しましたが、上手く動作しませんでした。 何が間違っているのか、ご指摘をお願いいたします。 質問は、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"  

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

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

まず, $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.

mooTaihen
質問者

お礼

rafysta様、Tacosan様 ご回答、ありがとうございました。 ご協力を頂いた結果、課題をクリアする事ができました。 結果として、@dataのパターンを使う事にしました。 『教えて、!Goo』を初めて使ったのですが、これで皆様にお礼の言葉が届いたか心配です。

その他の回答 (1)

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.2

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";

関連するQ&A