yybbs.cgiとinit.cgiとで共通にアクセスできるグローバル変数gMyCntを定義するのに四苦八苦してしまった。
同一ファイル(regist.cgi)では関数定義の外側にmy $xxx; と書けばどの関数からもアクセス可能なグローバル変数になるので、requireでincludeしているだけと思い同様にすれば可能と思ったがそうではなかった。
グローバル変数はパッケージ名を明示的に指定する必要があり $<package_name>::<var_name>とするようである。パッケージ名を省略した場合は$main::<var_name>となるとの事。
ただし定義側ではourを使ってもよい。
そこで試しに参照側もourを使ってみたところうまく動作した。
つまりinit.cgiの関数定義の外側で our $gMyCnt = 0; で定義し、yybbs.cgiの関数定義の外側で our $gMyCnt; と宣言すれば、両方のcgiの任意の箇所で単に$gMyCntで同一変数を参照できた。
文法的に正しいかどうかあまり自信がないが our は別名を定義するだけという説明が以下のサイトにあったので恐らくこれで正しいように思われる。
Perlの組み込み関数 our の翻訳
https://perldoc.jp/func/our
ということは require は単にincludeではなくどちらかというとコンパイル後のobjをつなぐものかもしれない。そして our は EXTERNAL宣言に近くアドレス解決を他モジュールでやれという指示なのかもしれない。
>そして our は EXTERNAL宣言に近くアドレス解決を他モジュールでやれという指示なのかもしれない。
==> 最初に出現した場所で領域が確保され、後続の our 宣言では既存の領域を参照するようにアドレス解決する。ということなのでしょうね。
以下のサイトを見つけた。
requireは動的リンクのようである。
[技術継承の現場] useとrequireの違い
http://www.ndis.co.jp/blog/tech/2008/10/use-require.html
うーん、スクリプト言語に動的リンクがあるとは驚きでした。高級ではあるがスパゲッティを生みやすい仕様ですね。