IT Office Nishimiyahara

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

強引な「require」

      2015/02/04

何度も同じ物を書くのはだるいし、気が変わったとき(笑)にすべてのスクリプトを変更するなんて大変だ。

というわけで、「require」の強引な使い方です。掲示板を作っていたときに、「設定部分だけを別で定義したい」と思ったのがきっかけでやってみた。

普通に「require」するファイルには、「package hoge;」のように「パッケージ名」を宣言する。しかし、パッケージ宣言を省略すると、呼出し元のファイルの一部として機能するようだ。

エラーメッセージを見ていると、パッケージ宣言されていないCGIスクリプト(つまり、一般的には呼出したCGIスクリプト)は「main」というパッケージ名で動作しているようだ。だから、「require」するファイルで「パッケージ宣言」されていないと、「mainパッケージ」として動作する。

つまり、「パッケージ宣言」していない「hoge.pl」を、「require」した場合、「hoge.pl」内の「hogesubサブルーチン」は「&hogesub」で呼出す事ができる。

ただし、このような方法では、呼出し側と同じ空間で実行されるので、例えば「hoge.pl」にある「hogesubサブルーチン」を、呼出し側でも宣言してしまうと、「Subroutine hogesub redefined」という詳細エラー(-wオプションをつけた場合)がでる。この場合、どちらのサブルーチンが実行されるかは謎です。また、変数も「hoge.pl」内で変更されると、値が変わってしまうので注意が必要です。

また、「require」するファイルが、最終的に「真」を返さない場合「require」できません。なので、念のため、最後に「1;」をつけておきます。これで「真」を返す事ができます。最後を「0;」とするとエラーが見れます。

・・・

今回、ローカル環境から完全に移行するために「jcode.pl」に変更しました。

で、リンク先の順番の事ですが、「tsenv.pl」はハッシュをソートして表示していたようです。なにか勘違いをしていたみたいですね。今回も偶然うまく行くようですが、今後のために配列を2つ使った方式に変更します。

また、テストの中には「Jcode」専用の使い方を用いていたので、それはコメントにしました。

ソースコード

tsenv.plソースコード

respo

respo link

ZenBackWidget

 - 情報技術について