IT Office Nishimiyahara

個人用スマホから商用プログラミングまでなんでもお任せ下さい

普通の「require」

      2015/02/04

強引な「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自体は違うけど)を使うと便利ですね・・・。

ソースコード

respo

respo link

ZenBackWidget

 - 情報技術について