• ベストアンサー

デゴートについて

初心者です。お願いいたします。 デゴートについての基礎を学んでいるのですが 行き詰っています。 $value=~s/%([a-fa-F0-9][a-fA-F0-9])/pack('C',hex($1) )/ge; という文なのですが、この解釈の仕方がイマイチ分かりません。 ●s/// = 置き換え演算子 ●『%([a-fa-F0-9][a-fA-F0-9])』を『pack('C',hex($1))』 に変換する ●hex関数 = 16進数に変換する ・・・と自力で少し理解してみたのですが、参考書によると、hex関数で16進数を10進数に変換する・・と逆のことが書いてあるんです(TT) それと最後の『ge』とはどういう意味なのでしょうか。 理解不足で申し訳ないのですが、どなたか詳しい方、アドバイスいただければ助かります。お願いいたします。

  • CGI
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.2

Perlの文法に関する質問はCGIカテゴリよりPerlカテゴリが適しているような気がしますが、それはさて置き、nekocyaさんが今問題としているのは、hex関数とgeオプションだけでしょうか。 hexについては、とほほさんの解説通り「引数を16進数の文字列と解釈してその値を返す」と理解すべきでしょう。(「16進数を10進数に変換する」というのは、関数そのものの解説文ではないような気がします。) 『ge』についての説明は割愛します。 詳しくはとほほさんのリファレンスをご覧下さい。 hex関数 http://tohoho.wakusei.ne.jp/wwwperl2.htm#hex 文字列置換 http://tohoho.wakusei.ne.jp/wwwperl1.htm#ReplaceOperand # デゴートとはデコード(decode)のことでしょうか。

nekocya
質問者

お礼

お返事遅くなりました。とても参考なり助かり ました!ありがとうございます! ちなみにデコードでした!

その他の回答 (1)

  • negi-bozu
  • ベストアンサー率25% (5/20)
回答No.1

正規表現を覚えてください。

参考URL:
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
nekocya
質問者

お礼

はいTT ありがとうございました。

関連するQ&A

  • URLデコードするソースですが、。。。

    分かる方、ぜひ教えていただきたいです。 CGI掲示板を作っていますが、 参考書に次のソースが載っており、 $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; それの機能は「URLデコード」だそうです。 多分、エンコードでわけのわからなくなった日本語文字(%98%45%83など)を ちゃんと読める文字にしてくれる機能だろうとは理解していますが。。。 上のソースをリファランスなどで調べたところ、 「hex()は16進数を10進数に変換する関数」で、 「pack()はバイナリ体構造体に変換する関数」とかいてありますが、 バイナリ体構造体??何それ???って感じです。バイナリって2進数ですよね? 日本語ってバイナリですか。どうも正確な意味が分かりません。 どなたか分かりやすい解説をお願いいたします。

    • ベストアンサー
    • CGI
  • フォームデコード

    よく見かける $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; というやつの pack("C", hex($1)) を chr($1) にした方がいい と思ったんだけど、chr($1) のソースは見たことがないです。 chr($1) にするとうまくいかない場合があったりするんですか?

    • ベストアンサー
    • CGI
  • CGIのスクリプトの解釈で分からないところがあります

    どうも、こんにちは(@^^@)。 CGIのPerlスクリプトを勉強しています。いろいろ手持ちの本を探してみたのですが、下記のスクリプトの一部の解釈の仕方が分からないので教えてください。HTMLフォームからパスワードを受け取って、照会するスクリプトの一部です。他の行は、大体分かるのですが8行目のみが分かりません。 まず、sと対応するgeの意味。また、hex関数の$1の意味。解説書には、$1は特殊な変数と書いてありましたが、それ以上詳しい解説は、ありませんでした。hex$は、単に16進数を10進数に変換するんですよね。そして、%(..)、pack("c",hex($1))も元の意味が分からないので解釈に困っています。 「パスワードを照会するスクリプトの一部です。」 1: homonsya = $ENV{'QUERY_STRING'}; 2: 3: @group = split(/&/, $homonsya); 4: foreach $ans (@group) 5: {($name, $value) = split(/=/, $ans); 6: 7: $value =~ tr/+/ /; 8: $value =~ s/%(..)/pack("c", hex($1))/ge; #.....???←「16真数を『読める文字』変換」とある。 9: $ok_homonsya{$name} = $value;} 10: 11:$pass = $ok_homonsya{'myName'}; また、ネットで調べようと思い、いろいろ検索してみると下記のような行をよく見かけました。 ☆ $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; こちらもとても疑問の行と似ていますし、今後もよく使いそうな感じなので、気になっています。私は、パスワードを受け取って、管理者フォームに移動するようなスクリプトを作りたいと思っています。どうぞ、よろしくお願いいたしますm(__)m。

    • ベストアンサー
    • Perl
  • デコード処理部分のプログラムについて

    デコード処理部分のプログラムで分からないトコがあるので教えてください。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'euc'); この『pack("C", hex($1))』、『eg』の部分の意味がよく分かりません。 『&jcode'convert(*value,'euc');』の部分も微妙なので、お願いします。

    • ベストアンサー
    • Perl
  • UTF-8から送信されたデータを日本語化するには?

    %E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A これを あいうえお に変換するには、どのようにデコードすればいいのでしょうか? ご教授お願いします。m(_ _)m [現在のソース] $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; my $value = Jcode::convert($value, 'utf8'); $FORM{$name} = $value; } ↓ 「縺ゅ>縺・∴縺・」が検出されます。

    • ベストアンサー
    • Perl
  • 入力フォームからの半角カナを認識させたい

    入力フォームからの半角カナを全角に変換したいのですが、方法はありますでしょうか。 h2z_sjisを使ってみましたが、うまく行きませんでした。 foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*name,'sjis'); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'h2z_sjis(*value); $FORM{$name} = $value; } <結果> アイウエオ(半角) → 渦慨オ よろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlプログラムをPHPで書き直しています

    Perlで作ったものをPHPで書き直しています。 似てるようで大変ですね。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; という表現ですが、これをPHPで書き直すとズバリどのように なりますか? ちなみにPERLのソースコードでは、このあと &jcode'convert(*value,'sjis'); になるのですが、PHPでPerlのこの変換を実現する一般的方法が あったら教えてください。その方法で全部書き直そうと思います。

    • ベストアンサー
    • PHP
  • 半角スペースが有効にならない。

    前のページで入力された値を取得するCGIですが、どうしても半角スペースを認識しません。 それどころか、半角スペースの後ろを一切消してデータを取得しています。 同じように作成したものはきちんと動いているのに…。 どこが間違ってるかご指摘お願いします。 ---------- #!/usr/local/bin/perl read(STDIN,$buffer,$ENV{'content_length'}); @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ tr/+/ /; $value =~ tr/+/ /; $key =~ tr/+/ /; print "Content-type:text/html\n\n"; print "$key<BR>\n"; print "<A HREF=./***.cgi>Back</A><BR>\n"; open (FH,">***.log"); @filew="$buffer\n"; print FH @filew; close(FH); exit; ---------- 以上です。よろしくお願いします。

    • ベストアンサー
    • CGI
  • 文字をISO Lathin 1 文字コードに変換したい

    $name ="%8B%B3%82%A6%82%C4";  $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; と書くと 「%8B%B3%82%A6%82%C4」が「教えて」 となることはわかったのですが、 逆に「教えて」を「%8B%B3%82%A6%82%C4」にする方法がわかりません。 Javaスクリプトだとescapeというのを使えばできるみたいなのですが、 perlを使ってできる方法があれば教えて下さい。 またそういう機能を持ったライブラリなんかがあるのでしたらそれも教えてもらえるとありがたいです。

    • ベストアンサー
    • Perl
  • tr///;はカンマを処理できないのですか?

    フォームからのよくあるデコード処理を私は以下のように書いてます。 (中略) foreach $pair(@pairs){ ($key,$value)=split(/=/,$pair); $key=~ tr/+/ /; $key=~ tr/,/_/; $key=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg; &jcode'convert(*key,'euc'); $value=~ tr/+/ /; $value=~ tr/,/_/; $value=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg; &jcode'convert(*value,'euc'); $input{$key}=$value; } ところが、フォームでカンマを入力するとtr/,/_/で置換えられるはずだとおもうのですが、カンマはカンマのまま渡ってきてるようです。 tr///;はカンマを処理できないのでしょうか? csvで書き出すとき問題があると思うのです。 ご存知の方いらっしゃいましたらよろしくお願い致します。

    • 締切済み
    • CGI

専門家に質問してみよう