普通の「require」

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

ソースコード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/perl

#BEGIN{
#   print "Content-type: text/plainnn";
#   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);
}
comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。