• ベストアンサー

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

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

  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • 連想配列とforeach

    連想配列 %hogeにおいて、.name の名前が最後に付く配列の値を取り出したいと思い、下記のようにしました。 foreach ($hoge{/.*\.name$/}) {  print "$_\n"; } としてみましたが期待した出力がされませんでした。こういう描き方って出来ないんでしょうか?それともどこか間違ってますか?

    • ベストアンサー
    • Perl
  • Perlのサブルーチンで連想配列(ハッシュ)を渡す

    Perlのサブルーチンで連想配列(ハッシュ)を渡す方法 -------------------------------------- $str=rep::replace(%A,$B,@C); -------------------------------------- sub refidrep ( \%\$\@ ){ my(%A,$B,@C)=(@_); } -------------------------------------- では、上手くいきませんでした。 どのようにしたら、連想配列をサブルーチンに渡せるのでしょうか? 分かる方いらっしゃいましたらご教授ください。

    • ベストアンサー
    • Perl
  • stdClass Objectを連想配列のように個別に取り出したい。

    $aに連想配列が入っているとして、 print "<pre>";print_r($a);print "</pre>";   ↓ array (  [Return] => array   (    [data] => あいうえお   ) ) このように連想配列の入った変数から データを個別に取るとき このように、配列名を並べると print $a['Return']['data']; ↓ あいうえお と、個別に取り出せますが、 あるデータをprint_rすると、 stdClass Object (  [Return] => stdClass Object   (    [data] => あいうえお   ) ) というふうに"stdClass Object"として出力されてしまいました。 stdClass Objectのデータを個別に取り出したいのですが 連想配列のような記述だとうまく取り出せません。 stdClass Objectのデータはどのようにして個別に取り出すのでしょうか?

    • ベストアンサー
    • PHP
  • 連想配列で

    繰り返し処理で連想配列の数字を変更しようとしたらうまくいきません 他にやり方ありますか? <?php $data['fre1']="りんご"; $data['fre2']="バナナ"; while ($k<3) { $k++; print(htmlspecialchars($data['fre{$k}'], ENT_QUOTES)); }

    • ベストアンサー
    • PHP
  • 配列の連想配列のソート

    お世話になります。mooTaihenです。 Perlで配列のソートが出来なくて困っております。 お忙しいところ、誠に申し訳けありませんが、ご教示をお願い致します。 【内容】  サンプルソースに示した様なデータ構成をソートしたいのですが、思惑通りに行きません。  期待しているソート結果は、 a1 b3 b4 c2  です。  <サンプルソース> my @data; $data[0]{name} = "b"; $data[0]{cnt} = 4; $data[1]{name} = "c"; $data[1]{cnt} = 2; $data[2]{name} = "b"; $data[2]{cnt} = 3; $data[3]{name} = "a"; $data[3]{cnt} = 1; @data2 = sort {chg($a,$b)} @data; foreach (@data2) { print $_->{name} . $_->{cnt} . "\n"; } sub chg { my(@s,@d)=@_; return $s[0]{name} cmp $d[0]{name} and $s[0]{cnt} <=> $d[0]{cnt}; }  <出力結果> a1 b3 c2 b4

    • ベストアンサー
    • Perl
  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

    • ベストアンサー
    • Perl
  • POSTで配列のデータを渡す方法は?

    初歩的な質問で申し訳ございません。配列でデータを入力し、POSTで配列のデータを渡す方法を知らなくて困っています。いろいろ調べましたが、見つかりません。 だれか、教えてください。 ..... &ReadParse(*in); for ($i = 0 ; $i <=10 ; $i++){    $data[$i] = $in{'data[$i]'}; } sub main { 。。。以下修正部分・。。。 print "<form method=\"POST\" action=\"$userpro\">"; print " <input type=\"hidden\" name=\"mode\" value=\"miss1\"><p>"; print " <input type=\"text\" name=\"data[1]\" size=\"20\" value=\"$data[1] \">"; print " <input type=\"text\" name=\"data[2]\" size=\"20\" value=\"$data[2] \">"; print " <input type=\"text\" name=\"data[3]\" size=\"20\" value=\"$data[3] \">"; ...... print " <p><input type=\"submit\" value=\"修正\" name=\"B1\"></p>\n" ; print "</form>\n" ; ・・・・ } #Submit後実行される関数 sub miss1 { print "Content-type: text/html\n\n"; for ($i = 0 ; $i <=10 ; $i++){ print "$i-$data[$i]<br>"; } exit; } 結果は 0-空(空白) 1-空(空白) 2-空(空白) 。。。 にです。 何が間違っているでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 連想配列を複数条件で比較して別配列に抽出したい

    idとnameとcountとその他のいろいろな要素を持つ連想配列entryがあります。 entry id name count … ------------- 1 satou 35 2 satou 49 3 sio   18 4 sio   29 5 sio   39 6 sio   40 7 miso  28 : -------------- データベースの操作で同じidのcountのみを更新したいため、このentryから、「nameが同じで、countが最大のものを抽出した3次元の連想配列entry2」を作成したいです。 entry2 id name count  ------------- 2 satou 49 6 sio   40 7 miso  28 : -------------- このような働きをするphpのコードを教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • たくさんの配列を簡単に操作したい。

    配列の要素を出力したいのですが、 @name_1 @name_2 @name_3 @name_4 print "@name_1\n@name_2\n@name_3\n@name_4\n"; としてるのですが、配列が100個あったとき書ききれません。 このような処理を簡単に書ける方法はないでしょうか? ニュアンスとしては以下のような感じです。 for($n=0;$n<100;$n++){ print "@name_$n\n"; } ご教授おねがいします。

    • ベストアンサー
    • Perl
  • perlでサブルーチンへの複数の配列渡し

    perlでサブルーチンに配列を渡しているのですが、 引数としている配列が1個の場合は問題ないのですが、 複数渡すと、第2引数以降が渡りません。 どの様にすれば上手くできますか。 例1 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; &test(@x1); sub test { my (@arg1) = @_; print "sub : @arg1 \n"; } 結果 main : 14 11 5 12 8 15 sub : 14 11 5 12 8 15 例2 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; print "main : @x2 \n"; &test(@x1, @x2); sub test { my (@arg1, @arg2) = @_; print "sub : @arg1 \n"; print "sub : @arg2 \n"; } 結果 main : 14 11 5 12 8 15 main : 12 10 8 9 sub : 14 11 5 12 8 15 12 10 8 9 sub : 引数1に全てが設定されて、引数2に設定されていない。

    • ベストアンサー
    • Perl

専門家に質問してみよう