リクエストパラメタを一括置き換えする方法

このQ&Aのポイント
  • リクエストパラメタを一括で置き換える方法についてまとめました。
  • リクエストされたパラメタを一括で置き換える方法をご紹介します。
  • 特定のリクエストパラメタを一括で置き換える方法を説明します。
回答を見る
  • ベストアンサー

リクエストパラメタを一括置き換え

リクエストパラメタを一括置き換え if( $ENV{'REQUEST_METHOD'} eq "GET" ) { $buffer = $ENV{'QUERY_STRING'}; } else { read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); } %req_params = map { /([^=]+)=(.+)/ } split /&/, $buffer; 上記のように書いていて、リクエストされたものを置き換える時は次のように一個一個書いています。 $req_params{name} =~ s/&/&/g; $req_params{mail} =~ s/&/&/g; $req_params{url} =~ s/&/&/g; このリクエストされたパラメタを一括で置き換えするにはどうすればいいのでしょうか? 例えば、上記の書き方で以下のようなことをしたいです。よろしくお願いいたします。 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } foreach ( split(/&/, $buf) ) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $val =~ s/&/&/g; $req_params{$key} .= "\0" if (defined($req_params{$key})); $req_params{$key} .= $val; }

  • Perl
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • kuzumiHK
  • ベストアンサー率72% (132/183)
回答No.1

req_paramsの連想配列をサブルーチンに渡すだけじゃだめでしょうか。 sub encode_normal{ $_[0] =~ s/&/&amp;/g; } foreach $key ( keys( %req_params ) ) { &encode_normal($req_params{$key}); print $req_params{$key} ."<br>"; }

yuutoOK
質問者

お礼

有難うございます。教えていただいたコードで解決出来ました。

関連するQ&A

  • 文字化けの事で?

    あるCGIを無料でダウンロードしました。 そのCGIはステップメールなのですが、使ってみていくつか弱点がありました。 特に気になるのはgmailだと文字化けしてしまう事です。 CGIとか全然いじった事がないからよくわからいのですが、プログラムのなかにデコード処理とかあったのでたぶんこれかと思いました。 以下のプログラムで何かおかしい(文字化けを起こす原因)箇所はあるのでしょうか? #//■デコード sub decode { local($buf, $key, $val); if (($ENV{'REQUEST_METHOD'} eq "POST") and ($post_flag ne 1)) { $post_flag=1; read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $post_flag=0; $buf = $ENV{'QUERY_STRING'}; } #csystem ($lc)=jcode::csystem($SCRIPT); foreach (split(/&/, $buf)) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # S-JISコード変換 &jcode'convert(*val, "sjis", "", "z"); # 不要コード排除 $val =~ s/"/&quot;/g; $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; if($key ne "comment"){ $val =~ s/\r|\n|\0//g; }else{ $val =~ s/\r|\0//g; } $in{$key} = $val; }

  • METHOD=GETでパラメータを渡す時に日本語が文字化けする。

    以下のようにMETHOD=GETでCGIスクリプトにパラメータを渡してQUERY_STRINGから読み出す場合、$a_wordが日本語だと文字化けして正しく送れません。 http://~/~/wwwperl.cgi?mode=tophtml&page=$next_line&a_word=$a_word http://~/~/wwwperl.cgi?mode=tophtml&page=10&a_word=テレビ朝日 $a_wordの「テレビ朝日」が「テ・E喞・」となってしまう。 フォームで送ればちゃんと表示されるのですが、ここはどうしてもMETHOD=GETで渡したいのです。 どなたか理由または解決方法を教えていただけると嬉しいのですが・・・ スクリプトはEUCで書いています。Jcode.pmを使用。 エンコード部分はこんな感じです。 sub decode { 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(/=/); $key =~ tr/+/ /; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; Jcode::convert(\$val, 'euc'); $FORM{$key} .= "\0" if (defined($FORM{$key})); $FORM{$key} .= $val; } $mode = $FORM{'mode'}; $page = $FORM{'page'}; $a_word = $FORM{'a_word'}; }

    • ベストアンサー
    • Perl
  • デコード処理について

    sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } while (($k,$v) = each %in) { $v =~ s/&/&amp;/g; $v =~ s/</&lt;/g; $v =~ s/>/&gt;/g; $v =~ s/"/&quot;/g; $in{$k} = $v; } } 上記の処理が、具体的にどうなっているのかよくわかりません。 どなたか分かる方、説明をお願いします。

  • CGI.pmのパラメーターの名前と格納物の一括処理について

    最近perlをはじめて、独学で勉強しております。 プログラム自体始めてで、なんとか各関数を覚えて、 現在初CGIとして自作メールフォームに挑戦しています。 そこでCGI.pmを使いたいのですが、項目追加時などの事を考えると 汎用性を持たせたいと思った時、 my @list = $cgi->param; foreach my $name ( @list ){   my $in{};     my $val = $cgi->param($name); $val = $cgi->escapeHTML($val); $in{$key} .= defined $in{$name} ? "\0$val" : "$val"; } ========================================================== この後その都度そのパラメーターを見極めて、 それようの自作のチェック関数へ引数として渡す。 ========================================================== しか思いつかず、同名複数データ(チェックボックスなどの時、 配列になっている)を どう処理していいかさっぱりわかりません。 どなたかCGI.pmにてフォームを受け取った時、汎用性を持たせる方法 をご存知でしょうか? 現在は仕方なくフォーム値を read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});で取得 ================================================= GET値はファイルアップロードとかを行わないので即undef $bufferを配列に格納、splitして$keyと$valに格納 10進数にもどして分割。foreachでまわして ====================================================== $val =~ s/&/&amp;/g; $val =~ s/"/&quot;/g; $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; $val =~ s/\r\n/\<BR\>/g; $val =~ s/'/'/g; $in{$key} .= defined $in{$key} ? "\0$val" : "$val"; としています。 また、オブジェクト指向がいまいちわからず、 メインルーチンには処理の流れ (最低限の呼び出しとゲッターとセッター?)だけを書いて、 他をモジュール化して参照をなんどもする方法を きちんと覚えるにはデザインパターン(?)とか言う物を 覚えたらいいんでしょうか? 初めてOKWAVEを使うのでわかり辛い説明になっているかもしれませんが、自分が気づかない分かりづらい部分はお手数ですがおっしゃっていただければ、できる限りのご説明をさせていただきます。 ご存知の方、よろしくお願いいたいます。 最後に 最終的なアップ先はレンタルサーバーなので、 もしモジュールが必要なら モジュールは最低限ピュアモジュールか依存関係の少ない アップできるだけで動くモジュールだとありがたいです。 アップ環境はperl5.8です。

    • 締切済み
    • CGI
  • GETパラメータ

    こんにちは CGI初心者です。 http://www.perl-labo.org/formdata/getmethod/get.cgi?日本語 この様に、日本語のGETパラメータを取得したいです。 http://www.perl-labo.org/formdata/jpname/ を参考にしました。 【記述】 #!C:/Perl/bin/perl package plab; sub getformdata { local $rawdata; local %formdata; local @inputs; local($input, $name, $val); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $rawdata, $ENV{'CONTENT_LENGTH'}); } elsif ($ENV{'REQUEST_METHOD'} eq "GET") { $rawdata = $ENV{'QUERY_STRING'}; } @inputs = split('&', $rawdata); foreach $input (@inputs) { ($name, $val) = split('=', $input); $name =~ tr/+/ /; $val =~ tr/+/ /; $name =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $formdata{$name} = $val; } return %formdata; } 1; 実行するとサーバーエラーになってしまいます。 パスは「#!C:/Perl/bin/perl」で合っています。 記述方法のミスでしょうか? 教えて下さい!

    • 締切済み
    • CGI
  • utf-8環境で標準入力からの全角文字にマッチさせる方法

    utf-8でフォーム処理のコードを書いてます。 euc-jpで動作していた全角文字の正規表現がutf-8で動作しません。 単純な「$str =~ /あ/」のような書き方ではなく、別な指定方法が必要なのでしょうか? ・perl5.8 文字コードutf-8 標準入力側文字コードutf-8 use utf8; my(%POST,$buffer,$key,$value,@data_s); if ($ENV{'REQUEST_METHOD'} eq 'POST') { if ($ENV{'CONTENT_TYPE'} =~ /application\/x-www-form-urlencoded/i) { binmode STDIN; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @data_s = split(/&/,$buffer); foreach $buffer (@data_s) { ($key,$value) = split(/=/,$buffer); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg; if ( exists ($POST{$key}) ) { $POST{$key} .= '<>' . $value; } else { $POST{$key} = $value; } } } } binmode STDOUT,":encoding(utf8)"; print "Content-type: text/html; charset=utf-8\n\n"; print "<br>\n"; foreach $key (keys %POST) { if ($POST{$key} =~ /[0-9]/) { print "全角数字にマッチ<br>\n"; }###### print "$key = $POST{$key}<br>\n"; } exit;

    • ベストアンサー
    • Perl
  • チェックボックスで得た複数回答を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
  • "ー"を含むとサーバーエラーになる

    HTMLのShift_JISに合わせて、Jcode.plで日本語コード変換のeucをsjisに変更したのですが、"ー"が$FORM{'key'}に含むとサーバーエラーになります。 どうしたら、sjisで"ー"など一部文字でエラーなく処理できるのでしょうか? アドバイスお願い致します。 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); $name2 = $name; $value2 = $value; $FORM2{$name} = $value; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); #←ここを変更

    • ベストアンサー
    • CGI
  • デコードフォームについて。

    以下のスクリプトについて質問があります。かなり多いのですが・・・ sub DecodeForm #返り値:Name=>Val のハッシュ(グロブ) #使用例:*form = EncodeForm(); print $form{name}; { my($encoding) = @_; my($method) = $ENV{'REQUEST_METHOD'}; local($query, @in, $key, $val); require 'jcode.pl' if $encoding; if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; } elsif ($method eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } local(@query) = split(/&/, $query); foreach (@query) { tr/+/ /; ($key, $val) = split(/=/); # %HH形式を元の文字にデコードする。 $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/\r\n/\n/g; jcode'convert(*key, $encoding) if ($encoding); jcode'convert(*val, $encoding) if ($encoding); $in{$key} = $val; } return *in; } 多いので先頭から順に箇条書きにさせて頂きます。 ・Name=>Val の意味。(#以下がメモであることは分かっています) ・グロブとは何か ・*form = EncodeForm(); print $form{name}; の意味。(特に、先頭の*が分かりません) ・my $encoding という変数も見たことがあるのですが、my($encoding) と my $encoding はどう違うのか。 ・クエリとは何か ・jcode.pl とは、インストールしたPerlに標準でついているライブラリなのか?そうでないのならjcode.plとは何か? ・%HH形式とは何か ・\rの意味 ・jcode'convert の意味 ・*key の * の意味 ・*in の * の意味 多くて申し訳ないです。分かる方いらっしゃいましたご教授くださると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 指定ディレクトリからcookie取得

    $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } $cook{'name'} ./index.cgiで、上記のように$ENV{'HTTP_COOKIE'}でクッキーを取得しています。 このままでは./に保存されたクッキーが取得されてしまいますが、これを、任意のディレクトリ(./../html/等)に保存された場所から取得したいと考えていますが、可能でしょうか。 CGIが設置されているディレクトリ = 'http://hogehoge/cgi-bin/'; COOKIEを読み込むディレクトリ = 'http://hogehoge/html/';

    • ベストアンサー
    • Perl

専門家に質問してみよう