• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CGIのスクリプトの解釈で分からないところがあります)

CGIのスクリプトの解釈で分からないところがあります

このQ&Aのポイント
  • CGIのPerlスクリプトを勉強しています。HTMLフォームからパスワードを受け取って、照会するスクリプトの一部です。8行目の意味や、hex関数の$1の意味、%(..)、pack("c",hex($1))の意味が分かりません。
  • パスワードを照会するスクリプトの一部です。sと対応するgeの意味、hex関数の$1の意味、%(..)、pack("c",hex($1))の意味が分かりません。
  • $value =~ s/%(..)/pack("c", hex($1))/geについて説明してください。

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

  • ベストアンサー
  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.1

例えばYahooなんかで検索をしたときに、アドレスバーに%A1%0B…なんて文字が羅列されるのはご存知ですか? #ご存じなければやってみてください。 日本語…というか、2バイトの文字は送信されるときに1バイトずつの文字列にエンコードされて送られます。 #%A1のA1は16進数の値です。 それを日本語に直す作業が $value =~ s/%(..)/pack("c", hex($1))/ge; であり、 $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; になります。 正規表現はご存知ですか? $1, $2, $3…は正規表現中の()の部分にマッチした文字列を順に返します。 s/%(..)/pack("c", hex($1))/ge; の場合ですと、%(..)の()です。 %(..)にマッチした”..”の部分をpack関数の引数として使用しているんですね。 頭のsは「与えられた文字列を一つの行として扱いなさい」という意味です。 改行が含まれていても、それは一つの行だと解釈されます。 gは「何度でもマッチする」という意味です。 これがないと、例えば”aBcad”のaをAに変えたいときに s/a/A/; としていると最初のaだけが変換され、”ABcad”という結果になってしまいます。 e「置き換えた部分も式とみなして実行しなさい」という意味で、 1度評価した値を置き換える文字列として使用されます。 確かe一つに対して1回評価が行われたと思います。 上記のことも含めて、Perlスクリプトについて詳しく解説されたサイトがありますのでご紹介しますね。

参考URL:
http://tohoho.wakusei.ne.jp/www.htm
noname#14302
質問者

お礼

yuizuianさんどうも、こんにちは(^^)。 この度は、お返事いただきありがとうございました。ネットでいろんな方に聞いたり、友達と試行錯誤したりしていて、pack関数のところでかなり苦戦したのですが、なんとかこれらを例示された用途で使う上では、理解できるようになりました! それから、URLの引数の解説もとてもよく分かりました。ご紹介いただいた、「参考URL」ですが落ち着いたら、一度ゆっくり目を通してみようと思っています。どうも、この度は、お返事下さって誠にありがとうございました! また、何か疑問とかありましたら力をおかしくださいませm(__)m。それでは、また(^^)。