• ベストアンサー

ハッシュのハッシュを実現したい。

ハッシュのハッシュを行いたいですがうまくいきません。 ◆正しい例 %ultraman = ( TARO => { cpu => "Celeron(266MHz)", memory=> "32MB", hdd => "4.3GB", }, JACK => { cpu => "Pentium2(333Mhz*2)", memory=> "128MB", hdd => "9GB*4", }, ); $name = "JACK"; $item = "cpu"; print "\$ultraman{$name}{$item}=[$ultraman{$name}{$item}]"; exit(0); __END__ ◆このように使えたら便利(要はハッシュの代入でハッシュのハッシュを実現したい) %a=(); %b = ("cpu"=>"aaaa", "memory"=>"bbbb"); $a{'JACK'} = %b; #---> このように代入したい $name = "JACK"; $item = "cpu"; print "\$a{$name}{$item}=[$a{$name}{$item}]"; exit(0); __END__

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

  • ベストアンサー
noname#5910
noname#5910
回答No.3

$hash{'key'} = %value; のように、ハッシュの値としてハッシュを代入すること はできません。コンパイルは通りますが意味不明の結果 となります。 ハッシュの値として使えるのはスカラーです。 従いまして、ハッシュのハッシュを実現するためには リファレンスを使う必要があります。リファレンスは スカラーの一種です。 メソッド1 $hash{'key'} = \%value; メソッド2 $hash{'key'} = {'key' => 'value'}; メソッド3 $value_hash = {'key' => 'value'}; $hash{'key'} = $value_hash; ご参考になれば幸いです。

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

その他の回答 (2)

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.2

あんまり使わない方法ですが、こんな方法もあります。 $a{'JACK'} = {%b};

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

$a{'JACK'} = \%b; #("\"を追加) わずかな違いのようで、 実は大きな違いというべきなのかもしれませんが、 詳細は書籍などにおまかせします(^^; ポイントとしては、 「参照」の扱い方が絡んでいます。 そのあたりを確認されてみると他にも面白い発見があるかもしれません。

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

関連するQ&A

  • ハッシュリファレンスの未定義

    サブルーチン/ハッシュリ/ファレンスで悩んでいます。 my (@r); $r[1]{"A"} = "1-A"; # 代入 &s(\@r); print $r[1]{"A"},"\n"; # 参照 print $r[2]{"B"},"\n"; # 参照 サブルーチン側でできない。 # sub s() { my ($c)=@_; @$c[1]->{"A"} = "1111-AAAA"; # もちろん代入できる @$c[2]->{"B"} = "2-B"; # 代入 これができない(ハッシュリファレンスの未定義エラー) } サブルーチン側で新規ハッシュのところに代入ができないのですが どのようにすればいいのでしょうか。

    • ベストアンサー
    • Perl
  • 二次元配列のハッシュ版の記述方法?

    二次元配列のハッシュ版を実現させたいのですが、 以下の記述で正しいでしょうか? 構文に疎いので教えてください。 #!/usr/bin/perl %HASH_TEST = ( 'あ'=>{'A'=>'1', 'B'=>'2', 'C'=>'3'}, 'い'=>{'A'=>'4', 'B'=>'5', 'C'=>'6'}, ); print $HASH_TEST{'い'}{'B'}; #=> 5が表示されます。 exit; __END__

    • ベストアンサー
    • Perl
  • 「Perl」ハッシュの使い方について

    Perlのハッシュで気軽に多次元配列のようなことをしたいのですができますか? (下記のコードで一応動きましたが、本当にこういった機能があるのか自信がもてません。) もし、可能である場合、 $fruits{'apple'}{'甘い'} = "リンゴ"; $fruits{'melon'}{'甘い'} = "メロン"; 以外の代入方法があれば教えてください。 また、 print values %$fruits; が表示されません。 表示させる方法はありますか? 以上、ご存知の方、居られましたらぜひ教えてください。 宜しくお願い致します。 -test.cgi----------------------------------------- print "Content-Type: text/plain\n\n"; $fruits{'apple'}{'甘い'} = "リンゴ"; $fruits{'melon'}{'甘い'} = "メロン"; print '結果:'.$fruits{'apple'}{'甘い'}; print "\n"; print '結果:'.$fruits{'melon'}{'甘い'}; print "\n"; print keys %fruits; print values %$fruits;# <<表示されない exit; -----------------------------------------

    • ベストアンサー
    • CGI
  • ハッシュを無名変数へ代入して任意の値を取り出したい

    %allarray内の'あああ'を表示させたいのですが、 foreach構文で回して if($name eq "$allarray{$key}"){ $TopName=$allarray{$key}; } とその都度してから$TopNameで表示させるのがだるいので下記のように無名変数へハッシュを代入して取り出せないかと試行錯誤しているのですが、解決に至るアドバイスなど頂けませんでしょうか $name='aaa'; %allarray = ( 'aaa' => 'あああ', 'kakaka' => 'かかか', 'sasasa' => 'さささ', ); $mumei=\%allarray; $TopName=$mumei{$$allarray}{$name}; print "$TopName"; で >あああ と表示させたいのです お忙しいかとは存じますがよろしくお願いします。

    • ベストアンサー
    • Perl
  • 無名配列からハッシュを作りたいのですが・・・

    $VAR1 = [ 'No', 'a', 'i', 'u', 'e', 'o', ]; #VAR1と同じ数の<>区切りの下記のようなデータを読み込み配列に代入 --List----------------------- 1<>あ<>い<>う<>え<>お<> ------------------------- foreach(0..$#List){ @Array=split(/<>/,$List[$_]); } 最終的なイメージは print "$a{No}"; >1 print "$a{a}"; >a となるよう、上記VAR1の無名配列の値をキーに、読み込んだ<>区切りのデータを関連付けて表示させるようにしたいのです。 foreach my$var(@$VAR1){ ...ここをどうすれば配列の値をハッシュのキーとして作成出来るのか頭を悩ませてます。 } 先輩方のお知恵をお借りできませんでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 動的なハッシュの配列を作成したい

    #お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか #!/usr/bin/perl #想定される配列 @array=(0,2,4,6,8,1,3,5,7,9); #下記が最終的に動的に作成したいハッシュの形です。 %List = ( '0' => [ (@array0_n) ], '2' => [ (@array2_n) ], '4' => [ (@array4_n) ], '6' => [ (@array6_n) ], '8' => [ (@array8_n) ], '1' => [ (@array1_n) ], '3' => [ (@array3_n) ], '5' => [ (@array5_n) ], '7' => [ (@array7_n) ], '9' => [ (@array9_n) ], ); $a='array'; $n='_n'; foreach (@array){ #試行錯誤中... print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}"; } __END__; お忙しいかとは存じますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • OS教えてください。

    CPU pentium2 400MHz、メモリー 96MB、HDD 6GB ですとOSはどれがいいでしょうか?

  • Win98からWinXPに移行するとき・・

    初めまして。Win98からWinXPに移行しょうと思って るんですけど、その条件はわかるんですけど。 どうやって調べ方かわかりません。教えてください。 ちょっと質問の説明がどう書いてわからないので ↓の方で説明します。 CPU・・・・・・300MHZ以上 メモリー・・・・最低128MB出来れば256MB以上 ハードディスク・1.5GB以上 CPU300MHZ以上って、どこに載ってるんでしょうか? メモリーはどこに載ってるんでしょうか? ハードディスクは容量はどこに載ってるんでしょうか? すいません、すごく初心者で。お願いします。

  • (Perl)ReadParseによるハッシュへの格納について

    PerlのReadPerseについて質問させてください。 以下少々長いですが、過程を書きます。 <form>タグにより、入力フォームのページをHTMLで作成したとします(form.html)。 その際、<form method="post" action="form.cgi"> と入力しておいて、別途form.cgiを作成するとします。 form.htmlには、<form>タグ内のname属性で、それぞれ'weight' 'height' 'age'という三種類のデータを入力してもらって、取得するようにしています。 そして<input type="submit" value="登録">による、 登録ボタンを押すことで、 form.cgiに処理をさせるようにしています。 form.cgiの中身ですが、まず、最初の三行を書きます。 #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); となるのですが、わからないのが、 三行目の &ReadParse(*form); です。 サブルーチンReadParseを引数*formで、 cgi-lib.plから呼び出しているということはわかるのですが、いきなり*formという形で、ハッシュを登場させているあたりがわかりません。(この際、ハッシュ名の前の%を*に変えなければならないことは、一応知っております。理由はわかりませんが。) そこで質問なのですが、 いきなり、ハッシュであるformを登場させていいものなのでしょうか?? 以下、form.cgiの内容です。 #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); $name=$form{'weight'}; $sex=$form{'height'}; $megane=$form{'age'}; print "Content-type: text/html\n\n"; print "<html>\n"; print "<body>\n"; print "体重:${weight}<br>\n"; print "身長:${height}<br>\n"; print "年齢:${age}<br>\n"; print "</body>"; print "</html>"; _END_

    • ベストアンサー
    • CGI
  • メモリーの増設について

    メモリーを追加したいと思っています NECのバーサプロ PC-VY12FHBUW OS ウィンXPホーム CPU ペンティアムM1.2Mhz メモリー512Mb (最大2GB) スロットは2個でうち1個に512Mbがあり空きは1個 (1) 512Mbを追加して  512+512=1GB (2) 1GBを追加して    512+1GB=1.5GB (3) 1GBを2枚にして   1GB+1GB=2GB (1)か(2)を考えていますがどれがいちばんよいでしょうか

このQ&Aのポイント
  • 入力電圧の間違いと抵抗の負荷がLEDの故障モードに影響していた
  • LEDの品番変更を忘れており、訂正が必要である
  • 過剰電圧と電流によるLED不良モードの原因について考える
回答を見る