• ベストアンサー

ハッシュの値のグループ化について

zeyperの回答

  • zeyper
  • ベストアンサー率12% (1/8)
回答No.2

初めまして、私も最近勉強を始めたものです。 まず、ハッシュとは aaa-bbb0-ccc0   -bbb1-ccc1   -bbb2-ccc2 と言う感じになっていてこれは、%aaaというハッシュになります。 %aaaのbbb0の中に、ccc0と言う値が入っているわけです。 ちなみにこれが@aaaだと、bbb0は数字0、bbb1は数字1でccc0がその値となります。 ですから、ハッシュとは、値(ccc)を入れるだけでなく、その値の入っているキー(bbb)も決められる、配列(@)のパワーアップ版みたいなものだと思ってください。 余計に分からなくなったらすいません。 ハッシュが分かったところで(分からなくても(笑))上のプログラムは、 syukei-20-3    -24-2    -25-1    -28-2 -32-1 と言うハッシュになります。++は下の専門家の言った通りだと(下を読んで初めて知った)数字を1足す、"$***++"と同じ効果があると言うことなので、 syukei-20- と初めて20を出したら++で syukei-20-1 とし、もう一度20を出したら++で、 syukei-20-2 として、それを最後に $cnt = $syukei{$key}; で$cntに値を入れているというわけです。ちなみにこの時$keyが20だと 3 = $syukei{20}; となります。 こんな雑な説明でわかっていただけたら幸いです。 最後にこの時 $abc = @list; とやると$abcには9が入ります。 配列をスカラー変数に入れると、配列の中のリストの数を返します。 $ハッシュ名{'キー名'} はキー名の中のスカラー変数を表しているので、$***の中にはスカラー変数を返しているだけです。

mika-o
質問者

お礼

ありがとうございます。しかし、 foreach $fld(@list){   $syukei{$fld}++; } の部分は $fld に @list の要素を一通り代入しなさい、という命令ですよね? それがなぜ @list の各要素をキーとして代入し、その登場回数を値として代入するのかが分かりません。 配列をスカラー変数に入れると、配列の中のリストの数を返すというのは分かりましたが、 「$ハッシュ名{'キー名'} はキー名の中のスカラー変数を表しているので、$***の中にはスカラー変数を返しているだけです。 」という説明が分かりません。

関連するQ&A

  • perl キーの集計について foreach文

    @list=(20,25,24,32,28,20,28,24,20); という、ある組織の人間の年齢の配列を定義したとします。 そこで、 foreach $fld(@list){ $syukei{$fld}++; } というforeach文によって、年齢を「キー」として集計していくという説明を受けたのですが、いきなりスカラー変数の$syukeiが出てきて、さっぱりわかりません。 $syukei{$fld}++; という一行の意味を教えてくださらないでしょうか。 また、++という記号を使用していますが、これを別の書き方で書き換えることはできないでしょうか。

    • ベストアンサー
    • CGI
  • ハッシュの要素の取り出し方

    ハッシュの要素の取り出し方で困っています。 以下のようにハッシュの要素を取り出して thmlタグの中に埋め込もうとしたのですが、 push( @arry, { 'syubetu' => 'cat' , 'name' => 'たま', 'age' => '12才', }, { 'syubetu' => 'dog' , 'name' => 'ポチ', 'age' => '2才' , }, { 'syubetu' => 'bird' , 'name' => 'ピ-コ', 'age' => '5才' , } ); @html_tag = ( '<table><tr><td>' . "\n", 'syubetu=$syubetu : name=$name : age=$age' . "\n", '</td></tr></table>' . "\n", ); foreach ( @arry ){ foreach $tag( @html_tag ){ $tag =~ s/\$syubetu/$_->{"syubetu"}/gm; $tag =~ s/\$name/$_->{'name'}/gm; $tag =~ s/\$age/$_->{'age'}/gm; print $tag; } $tag2 .= "syubetu: " . $_->{'syubetu'} . "\r\n"; $tag2 .= "name: " . $_->{'name'} . "\r\n"; $tag2 .= "age: " . $_->{'age'} . "\r\n"; } print $tag2; 結果が先頭の要素を登録数分、繰り返し出力してしまいます。 でも、同じforeachの中でも$tag2の場合は 正常に出力されます。 この違いがわからなくて困っています。 どなたか教えていただけますでしょうか。 ・出力結果 <table><tr><td> syubetu=cat : name=たま : age=12才 </td></tr></table> <table><tr><td> syubetu=cat : name=たま : age=12才 </td></tr></table> <table><tr><td> syubetu=cat : name=たま : age=12才 </td></tr></table> syubetu: cat name: たま age: 12才 syubetu: dog name: ポチ age: 2才 syubetu: bird name: ピ-コ age: 5才

    • ベストアンサー
    • Perl
  • ハッシュとif文

    CGIを改造しようと何とかがんばってます。 ハッシュから確答するものを表示したいのですが、うまく出来ません。 まずは、別ファイルにリストを保存しています。 %jlist = ( 11 => '項目1', 12 => '項目2', 13 => '項目3', 14 => '項目4', ~~ ); そして、ログファイルには数字が保存されています。 $genre←11から99までの数字が保存 これをwhileで繰り返し表示するリストにちゃんと項目名を表示させたいのですが、うまく出来ません。 foreach $key (keys(%jlist)){  if($key eq $genre){  print "[$value]\n";  } } とてつもなく変なことをしているかもしれませんが、どのようにしたら解決できるか教えてください。

    • ベストアンサー
    • Perl
  • 重複レコードをグループ化したいけど…。

    度々お世話になってます。 table1 【ID|フィールド1】 [1|AAA] [1|BBB] [2|CCC] [3|DDD] [3|EEE] [3|FFF] というようなテーブルがあるとして、クエリでは <table> <tr><td>1</td><td>AAA<br>BBB</td></tr> <tr><td>2</td><td>CCC</td></tr> <tr><td>3</td><td>DDD<br>EEE<br>FFF</td></tr> </table> …という形で表示したいのです。(理想です) 今までいろいろ試してみて、 $sql = " SELECT ID,フィールド FROM table1 GROUP BY ID "; に行き着きましたが、これだと <table> <tr><td>1</td><td>AAA</td></tr> <tr><td>2</td><td>CCC</td></tr> <tr><td>3</td><td>DDD</td></tr> </table> というように表示され、表示されないレコードが出来てしまいます。 GROUP BYが余計!と言われそうですが、同じIDが複数並ぶのを避けたいのです。 ソースコードは、 print "<table>\n"; print "<tr><th>ID</th><th>フィールド</th></tr>\n";  while( $row = mysql_fetch_array($result) ) {  print "<tr><td>$row[ID]</td><td>$row[フィールド]</td></tr>\n";  } print "</table>\n"; になっている状態です。 $row[フィールド]を書き換えればいいのかな?と思いますが、検索してもそれらしいものは見当たらなかったので質問させていただきました。 心当たりのある方、よろしくおねがいします。

    • ベストアンサー
    • PHP
  • Ruby 2次元のハッシュ

    Rubyで2次元のハッシュを扱いたいです。 perlで書くと以下のような感じです。(最近perlに疎遠なので自信無いですが^^;) hash{$key1}{$key2}=$value; foreach $key1 (keys %hash){ foreach $key2 (keys %{$hash{$key1}}){ print "$hash{$key1}{$key2}\n"; } } Rubyだとどんな感じになりますか?

  • 【PHP】smartyとPHPの記述違いとメリット

    smartyというのが、デザインとプログラムを分けれるというので 使ってみたのですが、 //--------------------smarty--------------------- <table border=1> <tr> <th>{$table.title}</th> </tr> {foreach item=result from=$data_list} <tr> <td>{$result[0]}</td> </tr> {/foreach} </table> と、smarty用の記述をHTML内にいろいろ書かなければならず //------------------php---------------------- <table border=1> <tr> <th><?=$table[title] ?></th> </tr> <?php foreach($data_list as $key => $value){ ?> <tr> <td><?= $value ?></td> </tr> <?php } ?> </table> とHTML内にPHPをいろいろ書くのと  あまり大差無い気がして どういう点がよいのがイマイチ分かりません。 smartyは 使う メリットは どういうものがあるのでしょうか。

    • ベストアンサー
    • PHP
  • ハッシュの中身の表示

    ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、test の戻り値は、スカラーとハッシュです。ハッシュを戻すときには参照渡し記号の\もつけています。 my ($return_code, %hash_data) = test(); 表示しようとすると、 Hash(0x5b04) のような表示にしかなりません、、 (試した表示方法は、下記4つです。) (環境は、WindowsXP上での、ActivePerl-5.10.0.1004 です。) foreach $key ( keys( %Hash ) ) { print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } while ( ( $key , $value ) = each %Hash ){ print "キー値 : $key\n"; print "値 : $value \n " ; } use Data::Dump qw(dump); print dump(\%hash); #print %display_test; 宜しくお願いします。

    • ベストアンサー
    • Perl
  • テーブルデータ表示

    mysqlからデータをphpで取得し以下のような多次元配列になっています。 Array ( [0] => Array ( [id] => 116 [name] => あああ ) [1] => Array ( [id] => 58 [name] => いいい ) [2] => Array ( [id] => 89 [name] => ううう ) ) 単純にデータを表示させたく以下のようにしましたが<th>$key2</th>の箇所が上記配列の場合 2回繰り返されて表示されてしまいます。ここはフィールド名なので1回の表示でいいのですが どのように記述すれば思うような表示になるでしょうか? echo "<table border=\"1\">"; echo "<tr>"; foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; //フィールド名 } } echo "</tr>"; foreach ($tmp1 as $key => $val) { echo "<tr>"; foreach ($val as $key2 => $val2) { echo "<td>" . $val2 . "</td>"; // 取得したデータをある分だけ繰り返し } echo "</tr>"; } echo "</table>";

    • ベストアンサー
    • PHP
  • CSVデータベース

    PHPを使い CSVのデータを表示させる事ができました。 がっ見た目がどうも汚いですよね・・・ もっとすっきりする方法はあるんでしょうか? あとCSVのデータを検索させるようにしたいのですが何かサンプルとかありませんでしょうか? 注文多くて申し訳ないですが、是非ともご教授よろしくお願い致します。 <table width="550" class="table01"> <tr> <td width="32" height="18"><div align="center"><strong>画像</strong></div></td> <th width="123"><strong>情報1</strong></th> <th width="58"><strong>情報2</strong></th> <th width="56"><strong>情報3</strong></th> <th width="53"><strong>情報4</strong></th> <th width="55"><strong>情報5</strong></th> <th width="56"><strong>情報6</strong></th> <th width="81"><strong>対象</strong></th> </tr> <?php $csv = fopen ("./data/new.csv", "r") or die(print "ファイルを開く事が出来ませんでした"); while ($items = fgetcsv ($csv, 1000,",")) { print "<tr>\n"; print "<td height='40' rowspan='2'><img src='$items[0]'/></td>\n"; print "<td><center>$items[1]<center></td>\n"; print "<td>$items[2]</td>\n"; print "<td>$items[3]</td>\n"; print "<td>$items[4]</td>\n"; print "<td>$items[5]</td>\n"; print "<td>$items[6]</td>\n"; print "<td>$items[7]</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td height='16' colspan='7'><div align='left'>$items[8]</div></td>\n"; print "</tr>\n"; } fclose($csv); ?> </table>

    • ベストアンサー
    • PHP
  • 動的ハッシュを作って取り出したいのですが・・・

    お世話になります。 フォームから送られてくるデータを動的に作ったハッシュで参照出来るように取り組んでるんですが、思ったように出来ず思い悩んでおります。 どうすれば、意図した形でデータを取り出すことが出来ますでしょうか my %FORM = ( 'd01' => 'あ', 'd02' => 'い', 'd03' => 'う', 'd04' => 'え', 'd05' => 'お', 'd06' => 'か', 'd07' => 'き', 'd08' => 'く', 'd09' => 'け', 'd10' => 'こ', ); for(sort { $FORM{$a} cmp $FORM{$b} } keys %FORM){ print "$_ = $FORM{$_} \n"; } $list="d01,d02,d03,d04,d05,d06,d07,d08,d09,d10,"; $i=-1; foreach (split/,/,$list){ $i++; $hash{$_}=$i; } for(sort { $hash{$a} <=> $hash{$b} } keys %hash){ print "$_ = $hash{$_} \n"; $view = ${"FORM$_"}; print "$view\n"; }; 最後のprint "$view\n";箇所で、 $list="d01,d02..." を split/,/,$list したので、 $FORM{d01} $FORM{d02} となるようにして、 「あ い う え お」と取り出したいのです。 ご教授のほど、よろしくお願い致します。

    • ベストアンサー
    • Perl