ダメだなー、今までの方法だと、やっぱりメモリが圧迫されているときエラーになります($^Mをいじることである程度の動作は可能ですが、これは…)。これは、サーバ上では動く可能性ナシと考えたほうが良さそうか。そもそも自分でもどこがどうなっているのか、追い切れないのだから、改善のしようがないです。やはり今のうちに方針を変更した方がいいのか…。
ところで、Perlでもオブジェクト指向プログラミングが出来ます。現在は非オブジェクト指向のぐちゃぐちゃな呼び出しなので、追い切れないところが多いのですが、オブジェクト指向にして、もうちょっと関数を整理すれば、ちゃんと追えるようになるかもしれない。ということで、クラス構造を考えているのですが…。
うーん、難しいです。まず、CGIという仕様自体があんまりオブジェクト指向的ではありません。なのでそもそもマッピングからして難しいのです。何とかマッピングできそうでも、ちょっと気を抜くとまた変な方向へ…。
また、Perlにはmixinという概念があります(Rubyで使えていた機能がPerlに移植されたらしいのですが)。これがまた、今までそういうものを使った経験がないので、これを使ったとたんに訳が分からなくなってしまう。ははぁ、わたしの知らないこともまだまだかなりあるのですね…。
さらにわたしが戸惑ったのが、Delphiなどと違って、self(インスタンスメソッドを呼び出したときの第一パラメータ)をつけて書いたときと、省略したときとの動作が違うということ。
sub sample(){ &message(); }
これは、sampleメソッドの中で、同じクラスのmessageというメソッドを呼び出す場合です。ふつうは。しかし、これだとこのクラスに限った場合は何とかなりますが、これのサブクラスでmessageメソッドをオーバーライドすると、とたんにおかしくなります。
サブクラスのmessageメソッドが呼び出されないのです。
sub sample(){ my $self = shift; $self->message(); }
と書くと、正常に動きます。DelphiやC#では常に実行中のオブジェクト自身を指すもので省略しても問題はなかったですし、ActionScriptなどのちょっとオブジェクト指向とは離れた言語でも大体同じ*1だったのですが、これはちょっと違います。
しかもmixinでそれをやるとまずいとか書いてあったりするし…。むー、何がどうなのかよく分からない…。
$^Mにメモリを確保して強引に押し通るべきなのか、それともオブジェクト指向に変更すべきなのか。それともPerlに見切りをつけてPHPか何かを始めてしまいましょうか、たしかさくらインターネットの最安プランでは使用不可でしたが、ロリポップなどでは使用可能でしたしね(Webプログラマー試験なんかの勉強にもなるし、データベース関係もしかり)。
*1:ActionScriptのthisは、現在再生中のフレームのことを指すそうなので、場合によっては違うのですが