Perl: 2011年11月アーカイブ

誰か、このブログを見たエロい、いや、偉い人がコメントを残してくれるかもしれないので書いとく。

今日、お客さんのところのサーバに 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系です。

このアーカイブについて

このページには、2011年11月以降に書かれたブログ記事のうちPerlカテゴリに属しているものが含まれています。

前のアーカイブはPerl: 2011年4月です。

次のアーカイブはPerl: 2011年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら