perlなんかナンだ!

仕事で、perlのコードの面倒を見たりしています。今日は、あるリクエストの管理をするスクリプトと闘いました。とあるシステムの出す要求を拾い出して、それを別の部署のシステムへ投げ込み、そこからの返事をまたもとのシステムへ伝えるという、まぁ、プロトコル変換器のようなものです。

そこで、リクエストが初回だったら、その要求する量を6倍にしてほしい、とかいう話が来ました。初回かどうかは、リクエストの管理をしているハッシュがあるので、そのハッシュのキーがあるかどうかで判断すればいいと思っていた。

コードの中に、リクエストを受け付けるまで、ハッシュにキーを与えるコードはないように見えた。ハッシュは、ハッシュのハッシュという形($h{key1}{key2}のようにアクセスする)になっていて、リクエストを受け付けたら、さらに、その下にハッシュ($h{key1}{key2}{key3})を作って、状態の管理などをしている。だから、初出かどうかは、次のコードでいいと思った。

!exists($h{key1}{key2})
が、これだと、うまく機能しない。いつも、二回目以降扱いなのだ。

何でだろうと延々と考えた。そして見つけた。その部分の少し前に、次のようなコードがあった。

next if $h{key1}{key2}{STATUS} > 3;
これは、ハッシュを作らないと思っていたのだが、perlは、ハッシュのハッシュのハッシュにアクセスしようとしただけで、勝手にハッシュのハッシュを作ってしまうのだ。この例で言えば、$h{key1}{key2}{STATUS}にアクセスしようとしたことで、$h{key1}というキーと、$h{key1}{key2}というその下のハッシュの中にもキーを勝手に生成してくれてしまうのだ oTL

結局、!exists $h{key1}{key2}{STATUS}で、問題の部分を置き換えることで、期待の動作をするようになった。勝手に作ってくれるのは便利なのかもしれないが、やはり、間違いを起こしやすい、おせっかいな機能だと思う。やっぱり、こういう perlの哲学には、僕は馴染めない。だからperlはやっぱり嫌い(自分のアタマが悪いのは棚に上げる。背が高いから大抵の人は届かないくらい高い棚だ。)