強引な「require」をやってしまいましたが、今度は、普通に「require」してパッケージを使ってみましょう。
パッケージにある「もの」を使うには、『「もの」の識別子、パッケージ名、「::」、「もの」の名前』を続けて書く。サンプルで使用しているパッケージを例にすると、「hogeprintサブルーチン」なら「&hoge::hogeprint」のようにして呼び出す。その他はソースを参考にしてください。
また、パッケージ内からでも、他のパッケージ名で宣言することもできるようだ。強引な「require」にも書いたとおり、パッケージ名のないCGIは「mainパッケージ」として動作するので、パッケージ内で「main::hogehoge」のようなサブルーチンを定義すると、パッケージ名無しで「&hogehoge;」のように呼び出すことができる。「dumpvar.pl」の「dumpValueサブルーチン」は、このようにして書かれていた。
ところで、サブルーチンを呼び出す場合、通常は「&」を頭につける必要がある。しかし、呼び出し時に引数をつける場合などは「&」を書かなくても呼び出せる。で、いろいろ試してみた結果、後ろに「()」がついているとサブルーチン(または関数?)として認識されるようだ。つまり、引数がない場合でも、そのことを明示的に表現する(つまり、中身が空の括弧を書く)と呼び出すことができる。この方法は「JavaScript」と似ているし、見栄えがいいので最近はよく使う。
また、「()」をつけない場合の不具合もある。
「&」も「()」も付けないと、「文字列」として解釈されるようだ。うっかり「print hoge::hogereturn;」のように使用すると、ファイルハンドルとして認識されてエラーになる。
それに、サブルーチン側で引数を受け付けている場合、引数を指定せずに「&hoge::hogeprint;」と呼び出してしまうと、「@_」が自動的に引数として渡されてしまうようだ。引数を受け付けるサブルーチンを呼び出す場合は、「引数がない」ということを示さないと、誤作動を起こす可能性が高い。実はこれが原因で、何度か嵌ったことがある・・・(^^;;;
この辺のことは、サンプルの中に例として書いたつもりです。
今更という気がしないでもないけど、日本語を扱う場合、特に出力コードを変換している場合に気をつけないといけないのは、漢字コードの統一。IE4などでは、「jis(iso-2022-jp)」と「sjis(shift_jis)」が混ざっていても、なぜか普通に表示されてしまい、漢字コードの混在に気付きにくい。ついさっきもこのミスをしてしまった(^^;;;
で、その時に、ブラウザ上で比較的簡単に間違いを発見する方法を思いついた。
CGIの漢字コード出力を「jis」に設定して、さらに「Content-type」で漢字コードを指定しないで(このサンプルなら「BEGIN」を有効にしておいて)CGIを実行する。そして、ブラウザに表示されたら、コードの種類で「日本語(シフト JIS)」を選択する。
そうすると、すべてが「jis」なら日本語(2バイト文字)が(普通の人なら)読めなくなるので、もし、この状態で(普通の人が)読める日本語があれば、変換忘れ(変換違い)があるということ。HTMLソースを見れば、わざわざこんなことしなくても良いんだけど、ソースの状態だと横スクロールがたくさんあって、見にくい。・・・まぁ、改行をたくさん書くようにすれば良いんだけど。
ASCII文字も含めて、全部の出力を「Jcode」にかければ、こんなミスはなくなるけど、なんだかね・・・。
ただ、この方法でもうまくいかないことがあった・・・。やはり、ソースを直に見るしかないのかもしれない。NNでは、出力を「text/html」に直してから表示させて、漢字コードを変えても、リロード(再描画?)されて元に戻るし・・・(T_T)
簡単にチェックする方法はないのかなぁ・・・。
・・・
このテストからは「tsenv.pl」を使っているので変更はほとんどありません。やはりパッケージ(tsenv.pl自体は違うけど)を使うと便利ですね・・・。
ソースコード
|
|