誰か、このブログを見たエロい、いや、偉い人がコメントを残してくれるかもしれないので書いとく。
今日、お客さんのところのサーバに Perl で書いたちょっとしたプログラムを置いた。
まあ、仕組みを考えるところに時間が取られた案件で、プログラム自体は大したことはない。ちょいプロのレベル。
その中で、URL の引数として渡された値(環境変数 QUERY_STRING にセットされる)を使う。具体的に言うと、「123xHgm78YYtz」のような文字列が来たら、頭の数字 3桁と、その後の文字列を取り出して別々の変数にセットしている。
Perl で正規表現を使って書くと、
if ($ENV{'QUERY_STRING'} =~ /^(\d{3})(.+)$/) {($a, $b) = ($1, $2);}
こんだけの話だ。
これで、変数 $a には「123」が、$b には「xHgm78YYtz」がセットされる。
・・・はずだったのに、何か上手くいかない。(^^;
上記の if 文の前で、$ENV{'QUERY_STRING'} の値を表示してみると、「xHgm78YYtz」になってしまっている???
前の 3桁が見事に消えてしまっているのだ。これでは上記の if 文で「真」にならない。
言っておくが、上記の if 文を通る前に $ENV{'QUERY_STRING'} を表示しているのに・・・だ。
謎すぎる(^^;;;
もちろん、上の if 文を見ていただければわかるのように、もし if 文を通った後だとしても、$ENV{'QUERY_STRING'} には何の編集もしていないので、値が変わってしまうなんてあり得ないのだ!
どうにも謎すぎる・・・(^^;;;
で、上記 if 文をコメントにすると、$ENV{'QUERY_STRING'} には正しく「123xHgm78YYtz」がセットされるようになるので、何かこの if 文が関係している可能性はあるのだが、上記のようにまったく問題無い if 文である。
ちなみに、正規表現の部分を /^(.{3})(.+)$/ にしてみたら、$ENV{'QUERY_STRING'} の値は「m78YYtz」になった。頭 6桁が消えちゃったようだ・・・
まあ、結局この怪しい動きの原因はわからなかったので、正規表現をやめ、
$a = substr($ENV{'QUERY_STRING'}, 0, 3);$b = substr($ENV{'QUERY_STRING'}, 3);
のように substr を使って値を抜くようにしたら正常な動きになったので、(Perl で substr なんか、格好悪う(^^;)取り敢えずヨシとしたのだが、なんなんかねぇ?これ。
もし、たまたまこのページを読まれた Perl の偉い人がいらっしゃれば、ぜひともご教示くださいませ。
ちなみに、Apache は 1.3系です。