- ベストアンサー
このプログラムの解説をお願いできないでしょうか?
以下の,意味を教えていただけると幸いです。 私は,HTMLからPerlに送り,再度記入者へ確認表示をさせたいと思っております。その中でこの部分が分かりません。お願いいたします。 for( $aIndex1 = 0 ; $aIndex1 < 20 ; $aIndex1++ ){ for( $aIndex0 = 0 ; $aIndex0 < 2 ; $aIndex0++ ){ $varName = "k" . $aIndex0 . $aIndex1 ; $anAns[ $aIndex0 ][ $aIndex1 ] = $input{ "$varName" }; $anAns[ $aIndex0 ][ $aIndex1 ] =~ s/\r\n//g ; } }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
がるです。 んっと…概ね二箇所の変更かと。 一つは前述の通りですので省略いたします。 もう一つは表示部分になるのですが。元々$anAnsをどのように処理していたかがもう一つ見えないのですが。 とりあえず「おもいっきりベタに定数で」片付けるなら、いっそ for($i = 0; $i > 19; $i ++) { } というループにして出力部分を出してしまってもよいのでは、と思います。 こんな感じでどうでしょうか?
その他の回答 (3)
- galluda
- ベストアンサー率35% (440/1242)
がるです。んっと…ご指名いただいたようなので(笑 > 駅伝の選手名を登録したいのです。1区~37区までに,HTML側で,name="k00"~k36まで順番設に定しています。それをPerlに送り,再度browserで,2列の19行で表示したいのです。 > ご理解いただけたでしょうか? なるほどなるほど。…だとすると、ちと前述のコードでは厳しいような。 まず確認なのですが。k00~k36は連番ですよね? 連番であると仮定して。これを「2列の19行」にしてみます。 概ねこんな感じになろうかと思われます。 $anIdx[0] = 0; $anIdx[1] = 0; for( $i = 0; $i <= 36; $i ++) { # keyの作成 $varName = sprintf("k%02d", $i); #print "$varName \n"; # データの取得と改行コードの削除 $data = $input{ "$varName" }; $data ~= s/\r\n|\r|\n//g ; # 配列へのデータ挿入 # keyの元値が奇数か偶数かで左右に振り分けています if ($i & 1) { #print "1 : $anIdx[1] \n"; $anAns[1][$anIdx[1] ++] = $data; } else { #print "0 : $anIdx[0] \n"; $anAns[0][$anIdx[0] ++] = $data; } } これを記述されていたコードのかわりに入れていただければ、@anAnsという二次元配列(正確には「配列の配列」)に、必要な情報が格納されるかと思います。 > 可能で有れば,自作のHTMLとPerlの両方を御覧いただけると幸いです。 こちらに載せていただければ拝見も可能かと思いますので。もし差し支えなければ。
補足
2000字を越えてしまい,全部は載せられませんでした。 #!/usr/local/bin/perl $outFile = "c:\\Httpd\\ekiden\\meibo" ; # 選手名表示用 @aFifth=('01A','02B', '03A','04B', '05A','06B', '07A','08B', '09A','10B', '11A','12B', '13A','14B', '15A','16B', '17A','18B', '19A','20B', '21A','22B', '23A','24B', '25A','26B', '27A','28B', '29A','30B', '31A','32B', '33A','34B', '35A','36B', '37A'); printf( "Content-Type: text/html\n" ); printf( "\n" ); if( &ReadParse( *input ) ){ $userGrade = $input{ 'userGrade' }; $userClass = $input{ 'userClass' }; }else{ print "Parsing Error !!!\n" ; exit ; } for( $aIndex1 = 0 ; $aIndex1 < 20 ; $aIndex1++ ){ for( $aIndex0 = 0 ; $aIndex0 < 2 ; $aIndex0++ ){ $varName = "k" . $aIndex0 . $aIndex1 ; $anAns[ $aIndex0 ][ $aIndex1 ] = $input{ "$varName" }; $anAns[ $aIndex0 ][ $aIndex1 ] =~ s/\r\n//g ; } } if( opendir TEMPF, $outFile ){ close( TEMPF ); }else{ # サブディレクトリを作成する必要がある。 if( ( mkdir $outFile, 0777 ) == 0 ){ print "can't mkdir $outFile: $!\n" ; print "試験コードによるディレクトリ作成にエラー発生\n" ; exit ; # このプログラムを終了 } } # 学年を利用してサブディレクトリを作成 $outFile = $outFile . "\\" . $userGrade ; if( opendir TEMPF, $outFile ){ # 作成しようとしてるディレクトリは存在 close( TEMPF ); }else{ # サブディレクトリを作成する必要がある。 if( ( mkdir $outFile, 0777 ) == 0 ){ print "can't mkdir $outFile: $!\n" ; print "学年によるディレクトリ作成にエラー発生\n" ; exit ; # このプログラムを終了 } } <HTML> <HEAD> <TITLE> 駅伝区間選手登録受付通知 </TITLE> </HEAD> <BODY> <TABLE ALIGN="center" BORDER="1"> <TR> <TH BGCOLOR = "lime" ><FONT SIZE="2">学年</FONT></TH> <TH BGCOLOR = "lime" ><FONT SIZE="2">クラス</FONT></TH> </TR> <TR> <TD ALIGN="center"> $userGrade </TD> <TD ALIGN="center"> $userClass </TD> </TR> </TABLE> <HR><BR> <TABLE ALIGN="center" BORDER="1"> <CAPTION ALIGN="top"> <FONT SIZE="4" COLOR="blue"><B>駅伝区間選手登録受付結果</B></FONT> </CAPTION> EOF
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 直接的な解説は出来るのですが…全体を見ているわけではないので、このソースコードが「本質的に何をしたいのか」は憶測でしか語れませんのでそのあたりご了承ください。 直接的には。 まず、前提条件として、%inputという変数に、色々とデータが入ってるようです。 で、%inputという連想配列は、k00からk119までのkeyをもっているものと思われます(完全な連番ではないのですが)。 > $anAns[ $aIndex0 ][ $aIndex1 ] = $input{ "$varName" }; は、二次元配列の中に、対応する$input内のデータを格納しています。 で、その格納したデータに改行コードが入っている可能性があり、それを削除するために > $anAns[ $aIndex0 ][ $aIndex1 ] =~ s/\r\n//g ; という1文が入っています。 で。この実装の根幹部分(哲学)なのですが。 恐らく「HTMLからPerlに送り,再度記入者へ確認表示をさせたい」という文言から察するに。 入力のほうのHTMLに、k00とかk10とかk01とかk11とかいったnameが存在しているのではないでしょうか? で、それらのデータを出力したりチェックしたりするために、一端データを二次元配列に落とし込んでいる、のではないでしょうか? 以上、何かの参考にでもなれば幸いです。
補足
早速にありがとうございます。もう少しご協力をお願いします。 駅伝の選手名を登録したいのです。1区~37区までに,HTML側で,name="k00"~k36まで順番設に定しています。それをPerlに送り,再度browserで,2列の19行で表示したいのです。 ご理解いただけたでしょうか? 可能で有れば,自作のHTMLとPerlの両方を御覧いただけると幸いです。ご検討下さい。
- ralf124c
- ベストアンサー率52% (232/446)
連想配列「%input : $input{'k00'~'k191'}」から値を2次元配列「$anAns[0-1][0-19]」に各々代入して、値の中に含まれる「DOS形式」の改行コードを削除してます。 蛇足かもしれませんが利用者のプラットフォームが異なると改行コードが変わりますので $anAns[ $aIndex0 ][ $aIndex1 ] =~ s/\r\n//g ; ↓ $anAns[ $aIndex0 ][ $aIndex1 ] =~ s/\r\n|\r|\n//g ; としたほうが良いと思います。 \r\n は DOS(Windows) \r は Mac \n は UNIX です。
お礼
お忙しいところありがとうございました。書籍での理解には限界があり,プログラムの勉強をしたいです。お世話になりました。
お礼
貴重な時間を頂戴いたしまして,感謝申し上げます。なんとなく分かってきたような気がします。まだまだ完全作動には至りませんが,ご教示いただいた内容と,書籍を読みあさりながら格闘したいと思います。誠にお世話になりました。ありがとうございます。