• ベストアンサー

デコード処理部分のプログラムについて

デコード処理部分のプログラムで分からないトコがあるので教えてください。 $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');』の部分も微妙なので、お願いします。

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

> 『pack("C", hex($1))』 これは、URLに含まれる「%xx」の部分を、元の文字に戻す処理です。 まず、s/%([a-fA-F0-9][a-fA-F0-9])/ が「%xx」の部分を探し出し、「xx」の部分を $1 に格納します。 次に hex($1) で、16進数で表した文字列である「xx」を相当する数値に変換します。 例えば hex("2F") の結果は、47 となります。 最後に pack("C", hex($1)) が実行され、先ほどの hex($1) の結果を文字データに変換します。(第1引数に "C" を指定すると、第2引数の数値(0~255)を対応するキャラクタに変換します。) 例えば先ほどの例の 47 ならば、「/」に変換されます。 > 『eg』 これは、s/PATTERN/REPLACEMENT/ に2つのオプション「e」と「g」を指定したものです。 「e」は REPLACEMENT をPerlコードとして実行し、その結果で置換しろ、というオプションです。 「g」は $value に含まれる PATTERN を全て置換しろ、というオプションです。 > 『&jcode'convert(*value,'euc');』 これは jcode.pl に含まれる convert という関数を実行しています。 jcode.pl は Perlのバージョンが4の時代に書かれた物なのでその頃の書き方となっていますが、現在主流のバージョン5では、jcode::convert(\$value,'euc'); と書くのが普通です。 jcode と convert の間の「'」(あるいは「::」)は、「パッケージ」(「名前空間」のようなもの)を参照するもので、この辺は難しいので後の課題されるとよいでしょう。 引数の *value(あるいは \$value)は、一般的に「参照渡し」と言われるもので、変数の値を渡す代わりに、その変数が格納されている場所の情報を渡します。 こうすると、呼び出した関数の中から呼び出し元の変数の値を操作することができ、そのような目的の関数では参照を引数に取るように設計されています。

Lone07
質問者

お礼

詳しい説明どうもありがとうございました。 『eg』って2つのオプションがつながってたんですか・・・w egとか無かったもんで^^;w 質問した後に気づいたような気づかないような・・・(ぇw パールのバージョン5で書いたほうがイイんですか。覚えておきます。 (パールのお勉強してから2日目とかw) jcode.plも最新バージョンにした方がイイんですか? あと、初心者がしやすいミスとか教えてください。CGIが動かない・・・・w \$valueは『C言語のポインタ』みたいな働きをするようですね。 覚えなおしてきます・・・・w またよろしくおねがいします。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Slihpon
  • ベストアンサー率0% (0/3)
回答No.1

$value = 'ab%82%A0cd%82%A2ef'; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print $value . '<br><br>'; ###abあcdいef $value = 'ab%82%A0cd%82%A2ef'; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/g; print $value . '<br><br>'; ###eはeval()です。置換後を関数と解釈しないので下のようになります。 ###abpack("C", hex(82))pack("C", hex(A0))cdpack("C", hex(82))pack("C", hex(A2))ef $value = 'ab%82%A0cd%82%A2ef'; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/e; print $value . '<br><br>'; ###gは何回でもという意味で、これを指定しないとデフォルトで最初の一回だけなので、abの次の%82がpack()を1回されるだけです。 ###ab・A0cd%82%A2ef

すると、全ての回答が全文表示されます。