• ベストアンサー

Perl初心者ですが

Perl初心者ですが、次の内容を説明してください。 $Word =~ s/(\W)/$escape{$1} ||= sprintf("%%%02X", ord($1))/eg;

  • nako
  • お礼率100% (1/1)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • y_oku
  • ベストアンサー率62% (25/40)
回答No.1

CGIに渡す文字列をエンコードしているのですね。 細かい関数の意味などや変数の意味は知っているものとして、説明します。 分からなかったら補足してください。 「\W」、つまりアルファベットや数字「以外」の特殊文字や漢字を、 %XXの形の16進数の数列に変換しています。 $Word='ほげ';は$Word='%A4%DB$A4%B2';に変換されますよね。 掲示板などのCGIの中に記述されていたものでしょうか? こうしておかないと渡されたCGIのほうで文字化けが起こったりして、 正しい文字列が渡されないのです。 ちなみに、この部分は$escape{$1}の部分がない次のスクリプトでも 同じように動くはずです。 $Word =~ s/(\W)/sprintf("%%%02X", ord($1))/eg; これならわかるでしょうか? じゃあ$escape{$1}はなにかというと、変換キャッシュとでもいうのかな。 sprintf関数は時間がかかるので、一度変換したことがある文字は、 その結果を%escapeというハッシュに保存しておいて使いたい。 つまりハッシュがあるときはそちらをつかい、ないときはsprintfの結果を代入するのが、「$escape{$1} ||=」の部分の意味ですね。 CGIやHTMLについてよく書いてあるページをリンクしておきますので、 そちらも参考にしてみてください。

参考URL:
http://wakusei.cplaza.ne.jp/twn/wwwcgi3.htm#CgiEncode
nako
質問者

お礼

丁寧な解答、ありがとうございました。 $escape{$1}のなぞが解けました。

関連するQ&A

  • [Perl] unpackで不要文字にエンコード

    Perl CGIについてです。 文字列をエンコードしようと次のようにしてみました。 $val1 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $val2 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $va1は問題なくエンコードされ、デコードも元文字に戻ったのですが、 $va2のエンコード文字に不要な'25'が含まれるようになってしまいました。 例:「ガム」をエンコード >> %A5%AC%A5%E0  を期待していたのですが、結果は %25A5%25AC%25A5%25E0 と不要に'25'が含まれてしまいました。unpackの文が悪いのでしょうか?ご教示ください。

    • ベストアンサー
    • CGI
  • ひらがなから全角カタカナへの変換の仕方

    Perlでひらがなから全角カタカナへの変換の仕方について教えてください。 ここのサイトで「全角カタカナからひらがなへの変換」の仕方が書いてありました。コレを元に逆に指定すれば出来るかな?って思ったのですが。。。どうやればいいのか全くわかりません。たぶんですが文字コードなどで指定しているとは思うのですが。。。どなたかわかる方がいましたら教えて下さい。よろしくお願いします。 #全角カタカナからひらがなへの変換の仕方 $a =~ s/(\x83)([\x40-\x7e])/"\x82".sprintf("%c",ord($2)+0x5f)/eg; $a =~ s/(\x83)([\x80-\x96])/"\x82".sprintf("%c",ord($2)+0x5e)/eg; 上記の逆に「ひらがなから全角カタカナへの変換」出来るようにしたいです。よろしく御願いします。

    • ベストアンサー
    • Perl
  • phpの日本語変換

    perl で日本語を下記のコードで変換しています $fname =~ s/(\W)/sprintf("%%%02X", ord($1))/ego; PHPからperlへの変換のコードがわかりませんよろしくお願いします。

    • ベストアンサー
    • PHP
  • 日本語でクッキーを読み書きしたいんですが。

    初心者用の文献読むのですが、クッキーはカウンターの説明ばかりで、日本語を扱えません。 また、クッキーの解説HPでは、 >CGI(Perl)でエンコードするには次のようにします。 >$xx =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; >CGI(Perl)でデコードするには次のようにします。 >$xx =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; と、書いてあるのですが、どこを書き換えればいいのでしょうか。ぜひご伝授をお願いします。 なお、只今改造中のソースは以下のURL掲載に掲載されております。 http://softplaza.biglobe.ne.jp/text/cgi/cgi13/cgi13-4.html

    • 締切済み
    • CGI
  • アルゴリズム解析をしてるのですが…

    いくつかのperlを解説したページを読んでみたのですが、 以下の文でフォーマットとしての"%02x"の意味と 「^」(演算子?)の意味がわからずつまづいてます。 $val =~ s/./sprintf("%02x",ord($&)^ord($aaa[$i++ % @aaa])))/ge どなたか教えてください・・・

    • ベストアンサー
    • Perl
  • 日本語のエンコード

    日本語 秘華をPHPでエンコードすると $fname = "秘華"; $name = rawurlencode( $fname ); %94%E9%89%D8 になり Perlで 秘華をPHPでエンコードすると $fname =~ s/(\W)/sprintf("%%%02X", ord($1))/ego; %20%94%E9%89%D8 になります PHPエンコードを%20%94%E9%89%D8 になるにはどのようにすべきですか よろしくお願いします。

    • ベストアンサー
    • PHP
  • Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコ

    Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコードするにはどんなコードを書けば良いのでしょうか。 "あ"という文字をHTMLフォームから受取って%82%A0というS-JISのバイトコードに再エンコードするコードを質問したら $a = "あ"; $a =~ s/([^a-zA-Z0-9*\-.@_])/sprintf("%%%02X", ord($1))/eg; $a =~ s/%20/+/g; print $a; という答えを頂きました。コードの意味はよく判らなかったのですが、ちゃんと思惑通り$aは%82%A0になりますので長い間重宝にさせていただいています。 今度は$a="あ";の値をUTF-8の%E3%81%82にエンコードしたいのですが、どのように上記のコードを変更すればよいか教えてください。正規表現というのを使えば出来るのでしょうが、本で読んでもやっぱりわかりません。

    • ベストアンサー
    • CGI
  • mac OSXでperlをするには?(perl超初心者)

     OSXのLibraryのなかにperlというフォルダがありますがもうすでに このなかにperlがはいっているのでしょうか? またはいってなければどこからダウンロードすればいいのでしょうか? また使い方などを初心者むけにやさしく説明しているサイトなどは ありませんでしょうか?

    • ベストアンサー
    • Perl
  • Perl 文字変換

    Perlで全角英数字を半角英数字に変換させたいのですが、 Jcodeを使わずにできる方法を教えてほしいです。 例えば zenkaku→zenkaku のようにです。 $value=~ s/$a\xA3([\xB0-\xB9\xC1-\xDA\xE1-\xFA])$b/pack("C", ord($1) - 0x80)/oeg; こういうのを試してみたのですが、上手く行きませんでした・・・

    • ベストアンサー
    • Perl
  • AppleScript(or Perl)でURLエンコードするには?

    AppleScriptでURLエンコードするにはどのようにすれば良いのでしょう? Perlを使えばできそうなのですがうまくいきません。例えば”あ”をエンコードしようとして、do shell scriptコマンドから echo 'あ' | perl -pe '~s/([^?w ])/"%".unpack("H2", $1)/eg;' としても"%a4%a2"が正しいのですが、"%e3%81%82%0a"が返ってきます。 暗ーいトンネルに入ったような状態です。どなたかお力をお借りできないでしょうか?