Perl/CGI入門: ハッシュeach関数の例題について
- ハッシュのeach関数を使ったプログラムの説明
- while文の条件部分に代入式が入る理由
- $keyと$valのスカラー変数との違いについて
- ベストアンサー
紙谷氏の「Perl/CGI入門」、ハッシュeach関数の例題について
ハッシュのeach関数を使って「猫はcat犬はdogお茶tea」と表示させるプログラムの主要部分です。 %list = ("猫"=>"cat" , "犬"=>"dog" , "お茶"=>"tea"); while( ($key,$val) = each( %list ) ){ print "$keyは$val"; } whileの条件部分の意味が分かりません。 ・なんで条件部分なのに代入みたいな式が入るのか? ・$keyと$valというのは普通のスカラー変数とは違うのか? 良く分からないので質問の仕方もおぼつかないですが、どなたか分かりやすく説明して頂けないでしょうか?
- mika-o
- お礼率58% (7/12)
- Perl
- 回答数2
- ありがとう数4
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
はいはい、補足です(笑) >each(%list) が返すのは (猫,cat) という その通りです。 「猫」と「cat」がそれぞれ配列変数の値として入ります。 >print each(%list); と書く print 文における配列の扱いは例外で、「中身をセパレータなしで並べて表示する」という動きをします。(セパレータを入れたい場合はシステム変数に設定) ですのでこの場合、print 文は、each(%list) が返した('猫','cat')という配列の中身を、セパレータなしでつなげて「猫cat」と表示したわけです。 >この中にある、$list{$key} という部分ですが はい、その通りです。 まず関数 keys は、ハッシュ配列変数のキー名すべてを配列にして返す関数です。 foreach は、その「返された配列」を1つ1つ $key に入れてループしてくれます。 すると、最初のループでは $key には '猫' が入ることになるわけですから、$list{$key} は $list{'猫'} と同じ意味になります。 もちろん、次のループでは $key には '犬' が入るわけです。 ですので、このプログラムと最初の質問のプログラムは同じ事をすることになります。
その他の回答 (1)
C言語もそうなんですが、Perl の条件式の特徴は、「比較と代入を同時に行える」という点です。そのために、比較演算子(==)と代入演算子(=)が別になってるんです。 このとき、比較式を記述しなければならない場所(今回の場合は while の中)に代入式だけを記述すると、Perl は自動的に、「代入された値が真か偽か」によって判定を行います。 真とは、0以外の数値や、undefine、または null ではない文字など、何かを処理するのに適した値です。 逆に偽とは、0、undefine、null です。 each は、ファイルの読み込みと同じようにハッシュ変数の中身を、呼び出すごとに順番に「配列として」返す変数で、すべての配列を呼び出し終わると null を返します。 ですので、正常なデータが返されているうちは、while はそれを「真」であると解釈し処理を繰り返しますが、each が null を返すと、すべての処理が終わったのだと解釈し、ループを抜けるわけです。 それから、($key, $val) という記述ですが、こんな記述ができるのは、俺が知る中では Perl だけです。(マイナーな言語には他にもこれができるものがあるようですが) Perl の関数が「配列」という巨大なデータを返すとき、それを受け取るための手法の1つがこの書き方です。 通常は配列を返す関数に関しては、受け取り側も配列を記述するのが普通です。 @kv = each( %list ); この書き方をすれば、$kv[0]、$kv[1] にそれぞれ値が入りますが、これでは少し面倒です。 そこで、Perl では、($key, $value) という括弧そのものを、「1つの仮的な配列」として扱うことができるのです。 ですのでこの処理が終わってしまえば、$key も $value もそれぞれスカラー変数として扱えます。 これを利用すれば、 ($a, $b) = ($b, $a); という記述も出来ます。これは、$a と $b の中身を入れ替えるという処理です。 説明が長くなってしまったので、不明点は別途補足ください(^_^;
お礼
ありがとうございます!条件が真か偽で判断することを忘れていたのと、リスト書式で代入が出来るということを知らなかったのが原因でした。 しかしそうすると each(%list) が返すのは (猫,cat) という書式のものと考えて正解ですか?しかし、 print each(%list); と書くと表示されるのは「猫cat」というようにキーと値がそのまま横に並んだものです。 なんかイマイチ納得できないです・・
補足
補足というか追加質問になってしまうのですが、次のような例文がありました。 foreach $key(keys(%list)){ $val = $list{$key}; print "$keyは$val"; } この中にある、$list{$key} という部分ですが、これはハッシュの要素へのアクセスを示す $ハッシュ名{'キー名'} でしょうか?
関連するQ&A
- Perl ハッシュの値のリストをスカラーコンテキストで評価すると?
こんにちわ。 初めての利用です。 Perlの事で質問なのですが、 my $score=($hash{"fred"},$hash{"barney"},$hash{"wilma"}); とすると$scoreにはキー「wilma」に対応した値が代入される様です。 リスト形式をスカラーコンテキストで評価すると、リストの要素数を返すと記憶していたので、この場合$scoreには3が代入されると思っていたのですが・・・。 試しに my @scores=($hash{"fred"},$hash{"barney"},$hash{"wilma"}); $score=@score; とすると$scoreに3が代入された様です。 この二つの式では一体何が違うのでしょう・・・?
- ベストアンサー
- Perl
- post と get
postとgetの両方でデータ送信が行われる可能性がある場合(あるときはpost、あるときはget)に簡単に効率よくデータを変数に入れてやる方法ってありますか? 最初は$_REQUEST を使っていたのですが、これではクッキー情報も入ってしまったため、これはやめました。そこで今は下のような方法を考えています。 if(postならば){ while(list ($key, $val) = each($_POST)) { $INPUT[$key] = $val; } } else {//getなら while(list ($key, $val) = each($_GET)) { $INPUT[$key] = $val; } } ただ、検索の仕方が下手なのか、受信した送信形式がPOSTかGETなのかということを知る方法がわかりません。 どなたかアドバイスを下さい。
- ベストアンサー
- PHP
- perlのexistsについて
変数の値と別のハッシュのキーに一致するものがあれば、ハッシュの値を別のスカラー変数に代入したいのですが、その場合のプログラム例を教えてください!
- ベストアンサー
- Perl
- フォームデータをハッシュで返すには?
前画面の入力内容を&ReadParse()を用いて取得し、 その後テキストボックス名などのオブジェクト名と 入力内容をEUCに変換してハッシュで返すという サブルーチンを作っています。 サブルーチンなので不特定多数の画面から呼び出されます。 下記のとおりにしてみたのですが、うまくハッシュに入っていないらしく、値を取得することができません。 どのようにすればいいでしょうか? ----以下プログラム---- sub Comp_SetParam { &ReadParse(*form); # パラメータ受取 #引数として渡されたフォームデータを格納 while(($key,$val) = each(%form)){ #キー名(画面のオブジェクト名)をEUC変換 &jcode::convert(*key ,'euc'); #画面入力値をEUC変換 &jcode::convert(*val ,'euc'); %in = ("$key" => "$val"); } #ハッシュにし返す return %in; }
- ベストアンサー
- Perl
- 意味を教えてください。
<?php @reset($HTTP_POST_VARS); while (@list($key,$val) = each($HTTP_POST_VARS)) { if ($key <> "pw_step") { echo "<input type=\"hidden\" name=\"" . $key . "\" value=\"" . $val . "\">\n"; } } @reset($HTTP_POST_VARS); ?> 上記の書き方で$val.の.はつなげる意味と同じで使われているのですか? また、$keyと$valの関係を教えてください。 ネットでもこの記述が多いのですが、優しい解説がなくて・・・。 どなたか優しく解説お願いします(^.^)
- ベストアンサー
- PHP
- arsort の key について
こんにちは、Blackwinglsです。 ちょっと気になったので質問いたします。 以下のデータのポイント表があります。 データはSQLで order by name で取り出してます。 name point H氏 50p F氏 8p D氏 8p K氏 6p これを以下のscriptで出力すると <?php arsort($point); $count = 1; while(list($key,$val) = each($point)) { echo $key; echo ":"; echo $name[$key]; echo ":"; echo $val echo "<br>"; $count++; } ?> 3:H氏:50 2:F氏:8 1:D氏:8 4:K氏:6 と表示されますが、同じscriptを <?php arsort($point); $count = 1; while(list($key,$val) = each($point)) { echo $key; echo ":"; echo $name[$key]; echo ":"; echo $val echo "<br>"; $count++; } ?> <?php arsort($point); $count = 1; while(list($key,$val) = each($point)) { echo $key; echo ":"; echo $name[$key]; echo ":"; echo $val echo "<br>"; $count++; } ?> のように立て続けに書くと、 3:H氏:50 2:F氏:8 1:D氏:8 4:K氏:6 3:H氏:50 1:D氏:8 2:F氏:8 4:K氏:6 のように、同じ $point の場合、氏名が都度入れ替わるようです。 これって正常な動きなのでしょうか? order by name なので、氏名順に常に表示される気がするのですが・・・? 最近、php4からphp5に変更したら出たような気がするのですが、私の気のせい? どなたか情報お持ちの方、ご示唆くだされば幸いです。
- ベストアンサー
- 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
- ハッシュの値のグループ化について
入門本に、次のような例題がありました(主要部分の抜粋です)。 @list = (20,25,24,32,28,20,28,24,20); #年齢リスト foreach $fld(@list){ $syukei{$fld}++; } print "<table><tr><th>年齢</th><th>人数</th></tr>\n"; foreach $key( reverse( sort( keys( %syukei ) ) ) ){ $cnt = $syukei{$key}; print"<tr><th>${key}才</th><th>${cnt}人</th></tr></table>\n"; これの実行結果は、@list の年齢を各年齢ごとにカウントして、表に各年齢が何人であるかを表示します。 ・$syukei{$fld}++; の部分は $ハッシュ名{'キー名'} でハッシュを作ろうとしているのだと思うのですが、++ がなぜ付くのか分かりません。 ・↑の考え方が合っているとしたら、$cnt = $syukei{$key} で右辺は $ハッシュ名{'キー名'} を表しているのだと思うのですが、左辺がスカラー値を求めている場合はキーの数を返すというルールがあるのでしょうか? 私の質問にこだわらず、分かりやすく全体の説明をして頂ければ助かります。
- ベストアンサー
- Perl
- hashをスカラー変数に渡す
最近、perlを勉強し始めたのですが下記のようなサンプルコードを 見たことがあります。 hashをスカラー変数「$test」に渡している。そして「%$test」でhashに変換してeachで回している。最初から「%test」のようにしてeachで回せばよいと思うのですが実際の業務とかでhashをスカラー変数で受け取るようなことってありえるのでしょうか? my $test = { a=>'test_a', b=>'test_b', c=>'test_c' }; while( my ($key, $value) = each %$test ) { print $key ." : " . $value . "\n"; }
- ベストアンサー
- Perl
お礼
丁寧にお答えくださって有り難うございます。 う~ん、しかし分かったような分からないような・・ 一度にたくさんのことを詰め込もうとし過ぎているのか、まだ混乱しています。 これから何度も読み直してみます。