強引な「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自体は違うけど)を使うと便利ですね・・・。
ソースコード
#!/usr/bin/perl
#BEGIN{
# print "Content-type: text/plain\n\n";
# open(STDERR, ">&STDOUT");
# $|=1;
#}
$usr_title = 'テスト28';
require "tsenv.pl";
require "hoge.pl";
{
printHeader($usr_title);
printBodyHeader($usr_title);
@_ = ('ホゲ1','ほげ2','hoge3');
$_ = 'hogeほげgehoげほ';
print '$_ = ';
Jprint($_);
print "<br>\n";
print '@_ = ';
Jprint(join(',', @_));
print "<br>\n";
print "<br>\n";
Jprint('&hoge::hogeprint;で呼出し<br>');
&hoge::hogeprint;
Jprint('&hoge::hogeprint();で呼出し<br>');
&hoge::hogeprint();
Jprint('&hoge::hogeprint($_);で呼出し<br>');
&hoge::hogeprint($_);
print "<br>\n";
Jprint('&hoge::hogeprint;で配列呼出し<br>');
foreach(@_){
&hoge::hogeprint;
}
print "<br>\n";
Jprint('&hoge::hogeprint($_);で配列呼出し<br>');
foreach(@_){
&hoge::hogeprint($_);
}
print "<br>\n";
Jprint('Jprint(hoge::hogereturn);で呼出し(不可。文字列と解釈される)<br>');
Jprint(hoge::hogereturn);
print "<br>\n";
Jprint('Jprint(hoge::hogereturn());で呼出し<br>');
Jprint(hoge::hogereturn());
Jprint('Jprint(hoge::hogereturn($_));で呼出し<br>');
Jprint(hoge::hogereturn($_));
print "<br>\n";
print '$hoge::version = ';
print $hoge::version;
print "<br><br>\n";
print '@hoge::version = ';
print foreach(@hoge::version);
print "<br><br>\n";
print '%hoge::version = ';
print "$_ => $hoge::version{$_}" foreach(keys %hoge::version);
print "<br><br>\n";
Jprint('hogehoge();で呼出し<br>');
hogehoge();
printFooter();
exit(0);
}
