プロが教える店舗&オフィスのセキュリティ対策術

Perl初心者ですが、次の内容を説明してください。

$Word =~ s/(\W)/$escape{$1} ||= sprintf("%%%02X", ord($1))/eg;

A 回答 (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#CgiE …
    • good
    • 0
この回答へのお礼

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

お礼日時:2000/12/20 12:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!