• 締切済み

CGIプログラムでわからない行があります

こんばんわ。 あるCGIプログラムのサンプルを読んでいるのですが、どうしても理解できないところがあります。 foreach(@a) { $n ++; $a[0]=~/([^=]+)=([^=]+)/; $ENV "NAME" . $n = $1; $ENV "VALUE" . $n = $2; } このループは一体どんな処理をしているのでしょうか。 部分だけの抜粋なので、わかりにくいかと思いますが とりあえず記号の意味だけでもわかればと思っております。 宜しくお願いします。

みんなの回答

  • wogota
  • ベストアンサー率42% (66/154)
回答No.1

コメントをつけると、こんな感じになると思います。 foreach(@a){         # 配列@aの個数だけループを行う $n++;             # $nをインクリメントする $a[0]=~/([^=]+)=([^=]+)/; # @aの0番目の要素(文字列)で、=で分けられた                 # 左右に対し、左は$1、右は$2に代入する $ENV "NAME".$n= $1;  # 環境変数として、"NAME?"(?には$nの数値を文字列に                 # したものが入る)に$1を設定する $ENV "VALUE".$n=$2;  # 同じく"VALUE?"に$2を設定する } となります。が、$a[0]という部分が何か変ですので、$_か$a[n-1]かも知れないです。 抜粋ということですので、$nはこのループの前で$n=0などの初期化がされていると思います。 ということで、正規表現を調べてみたほうがいいかもしれません。

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

関連するQ&A

  • CGI初心者です

    sub html でフォームに入力してもらい、 sub kekka で入力情報を確認し、 sub shori でテキストファイルに登録。 というプログラムを考えているのですが、 フォームから入力されたデータが入った変数$in{'name'} が、sub shori に移ると消えてしまいます。 いろいろ試行錯誤したのですが分かりませんでしたので 教えていただけたらと思います。 以下がサンプルのソースです。 #!/perl/bin/perl require './jcode.pl'; require './cgi-lib.pl'; &ReadParse; if($in{'action'} eq "set"){&kekka;} elsif($in{'action'} eq "sss"){&shori;} else{&html;} sub html{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト1</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n <INPUT type=hidden name=action value="set">\n 名前<br><input type=text name="name" size="30" MAXLENGTH="30"><br>\n <input TYPE="submit" value="確認"><INPUT type="reset" value="リセット">\n </form>\n </body>\n </html>\n EOM } sub kekka{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト2</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n <INPUT type=hidden name=action value="sss">\n name = $in{'name'} <input TYPE="submit" value="登録">\n </form>\n </body>\n </html>\n EOM } sub shori{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト3</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n name = $in{'name'} </form>\n </body>\n </html>\n EOM }

    • ベストアンサー
    • Perl
  • CGIのフォームメールで送信した値をTABLEで表示しています。横二列ではなく、一部、横五列に変更したい

    Perlで書いたCGIプログラムを使って、申し込みフォームを作成し、送信先をOutlookExpressのメーラーにしてHTML形式で表示しています。 サーバーはLINUX、メールを見ているPCはWindows98SEです。 CGIのプログラムはサンプルを使用しましたが、たいていのサンプルは、 フォームのnameの値とvalueの値を順に並べています。 foreach (0..$count-1) { print OUT "<TR><TD>$DATA_N[($_)]</TD><TD>$DATA_V[($_)]</TD></TR>\n"; } という具合にです。 ($DATA_N[($_)]はnameの値で、$DATA_V[($_)]がvalueの値です。) でも、この場合だとTABLEも横二列のものをずらっと並べるだけになってしまいます。一部、横五列に変更したいのですが。。 その場合は、フォームメールから送られるnameとvalueの値を順に並べるのではなく、それぞれ送信するデータに値をつけ、テーブルに入れ込む形になると思うのですが、いまいち、プログラムが分かりません。 私はCGIの初心者なので、いつもCGIのサンプルを使用し、一部変更しながら活用しています。なので、最初からCGIを書くとなると、どうも分からなくなってしまいます。 どなたかアドバイスお願いします。 できれば、プログラムも書いて教えて頂けると有り難いです。 参考にしたのは、下記のアドレスのものです。 (但し、これはテキスト形式で送信されています) http://www.rescue.ne.jp/cgi/webform/

    • ベストアンサー
    • CGI
  • javascriptのフォームデータをCGIで複数行取得

    javascript内の変数を複数行のフォームでCGIに渡したいのです。 その際のコードが document.write("<form name='form1' action='xxx.cgi' method='post' enctype='text/plain'>"+           "<input type='hidden' name='state' value=''>"+           "<input type='hidden' name='state2' value=''>"+           "</form>"+           "<input type='button value='送信' onClick='tocgi(a,b)'>");       tocgi(n1,n2){       document.form1.state.value=n1;       document.form1.state2.value=n2;       document.form1.submit();        } なのですが、a、bの値がそれぞれ10、20だった時、一行目のフォームデータは出力されるのですが、2行目が出力されないのです。実行結果でいうとstate=10ですね。引数を一つにしても同じでした。何がいけないのか、全然わかりません…。それとも、CGIのコードの書き方に問題があるのでしょうか。でも、CGIの方は変えずに単純にHTMLで記述すると上手くいくみたいなんですよね。どなたかわかる方がいたら助けて下さい!

    • 締切済み
    • CGI
  • チェックボックスで得た複数回答をCGIモジュールを用いて簡潔に取り出すには

     <input type="checkbox" name="id" value="0">  <input type="checkbox" name="id" value="1">  <input type="checkbox" name="id" value="2">  <input type="checkbox" name="id" value="3"> のようなフォームのキーと値を、CGIの方では%inで受け取ります。 まずCGIモジュールを用いてキーと値を$keyと$valに格納したのち、idというキーは4つの値を受け取るので、  foreach my $key ($q->param()) {   my $val=$q->param($val);   if(defined($in{$key)) {    $in{$key}.="\0";   }   $in{$key}.=$val;  } 私のイメージでは、この処理で  $in{'id'}="0\01\02\03"; が得られるつもりでした。 ところが実際には$q->param('id')で取り出せるのは最初の"0"のみで、したがって得られる結果は  $in{'id'}="0"; となります。 CGIモジュールを使わなければ、  my $buf;  if(ENV{'REQUEST_METHOD'} eq "POST") {   read(STDIN,$buf,$ENV{'CONTENT-LENGTH'});  }  else {   $buf=$ENV{'QUERY_STRING'};  }    foreach(split(/&/,$buf)) {   my ($key,$val)=split(/=/);      if(defined($in{$key)) {    $in{$key}.="\0";   }   $in{$key}.=$val;  } のようにして、イメージ通り  $in{'id'}="0\01\02\03"; を得られますが、CGIモジュールは他でも使うので、どうせならCGIモジュールを使った簡便なコーディングが出来ないものかと思案する次第です。 しかしながら私に思いつく方法は  <input type="checkbox" name="id0" value="0">  <input type="checkbox" name="id1" value="1">  <input type="checkbox" name="id2" value="2">  <input type="checkbox" name="id3" value="3"> として、まずCGIモジュールを用いた上記の方法で$in{'id0'}~$in{'id3'}までを生成し、次に  if(/(\w+)\d/) {   if(defined($in{$1})) {    $in{$1}.="\0";   }   $in{$1}.=$val;  } とやる方法しか思いつきません。 チェックボックスを用いて複数回答を得るというのはよくある話なので、CGIモジュールにもっと良いコーディングの仕方がありそうな・・・と思ってしまうのですが、これが最善の方法なのでしょうか?

    • ベストアンサー
    • Perl
  • CGIデコードでつまづいています。

    PerlCGIのデコードでつまづいています。jcode.plで$valueの値を「%E3%81%BF%E3%81%AE%E3%82%8A%E5%8F%B0」から「みのり台」の日本語に変換しようとしたのですが「%E3%81%BF%E3%81%AE%E3%82%8A%E5%8F%B0」が返されてうまくいきません。申し訳ありませんが知恵を貸して頂けないでしょうか、よろしくお願い致します。 #!/usr/bin/perl require './jcode.pl'; #デコードするためのプログラム # プラウザからのデータ取込み #if ($ENV{'REQUEST_METHOD'} eq "POST") { # read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); #} #else { $buffer = $ENV{'QUERY_STRING'}; #} # プラウザからのデータ変換 #$i = 0; #※2 @pairs = split(/&/,$buffer); foreach $pair (@pairs) { #1行毎に$name,$valueを取り出す ($name, $value) = split(/=/, $pair); # 変換演算子 tr + を スペースに置き換え # $value =~ tr/+/ /; # 変換演算子 s/// 単語の構成文字にマッチ # $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # " を &quot; に変換 # $value =~ s/"/&quot;/g; #\n を "" に変換 # $value =~ s/\n//g; print qq(   <tr><td>やった</td></tr>   ) , "\n"; # jcodeでデコードがうまく出来ませんでした。 # 日本語に変換(デコード処理部分) &jcode'convert(*value,'sjis'); &jcode'convert(*$name,'sjis'); # $FORM{$name} = $value; #※1 # @num[$i]=$value; #※2 # $i=$i++; #※2 # $str = decode('shiftjis', $value); # $value = encode('shiftjis', $str); } @varuee = split(/&*q=/,$ENV{'QUERY_STRING'}); print qq(   <HTML>   <HEAD>   <TITLE>画像の検索結果</TITLE>   </HEAD>   <BODY bgcolor="#FFFFFF">  <H2 align="center">画像データベースの検索結果</H2>  <!--画像の検索結果を2~3件ためしに表示-->  <BR>   <hr>   <CENTER>   <table> ); print qq(   <tr><td>$value</td></tr>   ) , "\n"; exit;

    • ベストアンサー
    • Perl
  • CGIプログラムがうまく作動しないのですが

    OCNのPage On に簡単な入力フォームのCGIが載っており,それをホームページビルダーのIモード版に利用しようと,HTMLに貼りつけるのですが,なかなかうまくいきません。 (提供されているCGI) <FORM METHOD="post" ACTION="/cgi-bin/formmail.pl"> <INPUT TYPE="hidden" NAME="recipient" VALUE="???@???.ocn.ne.jp"> [題名]:<INPUT NAME="subject" SIZE="30"><BR> [氏名]:<INPUT NAME="name" SIZE="30"><BR> [E-mail]:<INPUT NAME="email" SIZE="30"><BR> [コメント]:<INPUT NAME="comment" SIZE="30"><BR> <INPUT TYPE="submit" VALUE="送信"> <INPUT TYPE="reset" VALUE="クリア"> </FORM> (以上) [題名]と[コメント]の部分は必要ないので,この部分は削除し,代わりに [性別][年齢][職業]といったものを[氏名]の下に次のように作って追加したのですが…。 [性別]:<INPUT NAME="sex" SIZE="6"><BR> [年齢]:<INPUT NAME="age" SIZE="6"><BR> [職業]:<INPUT NAME="occupation" SIZE="10"><BR> ちなみに最後の「送信」の部分を押すと「氏名}の部分の情報だけが送信されます。 どこに問題があるのかご教示頂ければ非常に助かります。 よろしくお願いします。

  • safariで買い物かごに残らない

    ある買い物カゴCGIを使用していますがsafariだと日本語表記の商品だけ買い物カゴに入れても残りません。 次の買い物をしたり買い物カゴを確認した時に入っていません。英数表記の商品は大丈夫です。 CGIそのものが古いので替えるのがベストなんですが、諸事情により当面これを使用しなければいけないので何とか御教授お願い致します。 多分下記の部分が問題だと思うのですがCGIなどは全くの素人なので分かりやすくお願い致します。 *********************************************************** if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 記録するデータはsjisに統一する &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/://g; $value =~ s/,//g; $FORM{$name} = $value; } $soryo = $FORM{$soryo}; #--------# $cookies = $ENV{'HTTP_COOKIE'}; @cookie_pairs = split(/;/,$cookies); foreach $cookie_pair (@cookie_pairs) { ($name, $value) = split(/=/, $cookie_pair); $name =~ s/ //g; $DUMMY{$name} = $value; } $goods_next = 0; foreach $goods_num (1 .. $#cookie_pairs + 1) { $cookie_name = 'CARGO_'.$goods_num; if ($DUMMY{$cookie_name} =~ /^goods:/ || $DUMMY{$cookie_name} =~ /^removed/) { $GOODS[$goods_num] = $DUMMY{$cookie_name}; $goods_next = $goods_num + 1; } } #--------# ***********************************************************

    • ベストアンサー
    • CGI
  • CGIでJavaScript

    今自作の管理ページを作っているのですが、ある部分で詰まってしまってしまいました(^^; プルダウンメニューを付け加えるコードがありますよね? <SELECT NAME=menu> <OPTION VALUE=$i>$name</OPTION> </SELECT> ↑これです プルダウンメニューから項目を選ぶ時、今どの項目が選択されているかをプログラム側で判断することはできないでしょうか? 今のところVALUE値に0~Nの値を設定して、QUERY_STRINGから値を取り出し、そこから判定させているのですが、これだと一々メッセージとして飛ばしてやらないと判定できませんよね?(できれば更新しないで反映させたいのです) そこで、項目を選択した瞬間に今どの項目が選択されているのか(selectedIndexを使うのでしょうか?)をプログラム側に渡したいのです。(項目番号だけでいいので) JavaScriptの中で$aなど変数を設定してもどうもうまく代入してくれませんでした。 その時のコードは、 function change(){ $a = form.select.selectedIndex; } です。 それともう一つ、CGIの場合、リアルタイムに処理をすることはできるのでしょうか? 掲示板など、投稿ボタンを押すとページが更新されて、メッセージが追加されます。 上記のプルダウンメニューを選択した瞬間にいろんな処理(JavaScriptではなくPerlで)をさせることは可能でしょうか? かなりわかりにくい文章になってしまいましたが、 どなたか、わかる方レスお願いしますm(__)m

    • ベストアンサー
    • Perl
  • document.writeからcgiへ出力すると文字化けします。

    フォームへ入力したデータを、いったんJavaScriptのdocument.writeでプレビューして、そこからCGIへ出力するプログラムを書いています。 プレビューせずにCGIに出力すると問題ないのですが、document.writeで出力すると、日本語が文字化けしてしまいます。半角英数字は大丈夫です。 document.writeした状態のソースをhtml化して出力するとこれまた大丈夫なのです。 コードを変えたり、jcode.plを利用させもらったりしたのですが、変わりませんでした。 CGIファイルのほうは途中で、この後、$valueをテキストファイルに出力したいと思っています。 もしお暇なときにでも、理由と対策を教えていただければ幸いです。 まだ不慣れなので、おかしいことをしていたら申し訳ありません。もっといい方法があれば、ぜひ教えてください。 入力用ファイル <html> <head> <script type="text/javascript"> function aaa(){ a=document.ff.tname.value; b=document.ff.tsono.value; document.write('<html>\n<head>\n</head>\n<body>\n'); document.write('<form name="ff0" method="post" action="test3.cgi">\n'); if(a==""){document.write('お名前欄が空です!<br>\n')}; if(b==""){document.write('その他欄が空です!<br>\n')}; document.write('お名前:<input type="text" name="t0name" style="border:none;font-size:16;" value="'+a+'"><br>\n'); document.write('その他:<input type="text" name="t0sono" style="border:none;font-size:16;" value="'+b+'"><br>\n'); document.write('<input type="button" value="戻る" onmousedown="window.history.back()">') if((a!="")&&(b!="")){ document.write('<input type="submit" value="送信">\n'); } document.write('</form>\n</body>\n</html>'); } </script> </head> <body onload="document.ff.tname.focus();"> <form name="ff" method="post" action=""> お名前:<input type="text" name="tname" style="ime-mode:active"><br> その他:<input type="text" name="tsono" style="ime-mode:inactive"><br> <input type="button" value="確認" onmousedown="aaa()"> </form> </body> </html> CGIファイル #!C:\Perl\bin\perl print "Content-type:text/html\n\n"; read (STDIN,$aaa,$ENV{'CONTENT_LENGTH'}); print "<html>\n<head>\n</head>\n<body>"; @bbb=split(/&/,$aaa); foreach $ccc(@bbb){ ($name,$value)=split(/=/,$ccc); $value=~ tr/+/ /; $value=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; print "$nameは$valueです。"; } print "</body>\n</html>";

    • ベストアンサー
    • Perl
  • チェックボックスからデータ受け取り

    htmlフォーから <input type="text" name="name"> <input type="checkbox" name="check[]" value="softbank">ソフト <input type="checkbox" name="check[]" value="docomo">ドコモ <input type="checkbox" name="check[]" value="au">Au foreach(${"_" . $_SERVER["REQUEST_METHOD"]} as $k=>$v) {  ${$k}=$v; //一括サニタイズ処理します。 } $_POSTのデータは$sample的な使い方ですが、 echo $name; →は表示OK 問題はチェックボックスデータですが、配列では上のforeachの処理では、受け取れません。上のforeach処理のような方法で、配列を$sample[]としても受け取るにはどのようにすればいいかアドバイス下さい。 当然$sample[]で受け取った後は、foreachとかでデータを取得処理します。

    • ベストアンサー
    • PHP
DCP-J926N 複数のPCとの接続
このQ&Aのポイント
  • DCP-J926NプリンターのUSB接続において複数のPCとの通信ができないトラブルについて解決方法をご紹介。
  • DCP-J926NプリンターのUSB接続時にネットワーク接続との併用ができない問題について解説。
  • DCP-J926NプリンターをUSBでDESKTOP PCと接続する際の注意点とトラブルシューティング方法をまとめました。
回答を見る