お名前
メール
題名
記事
URL
編集キー 任意の8文字以下の英数字を入力して下さい。(修正・削除用)
画像認証 【必須】 右画像の数字を入力して下さい。  画像認証
文字色
 
No.213perlのグローバル変数
2020/09/29(Tue) 14:12:54
Name清水31

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宣言に近くアドレス解決を他モジュールでやれという指示なのかもしれない。


No.214Re: perlのグローバル変数
2020/09/29(Tue) 15:30:27
Name清水31

>そして our は EXTERNAL宣言に近くアドレス解決を他モジュールでやれという指示なのかもしれない。

==> 最初に出現した場所で領域が確保され、後続の our 宣言では既存の領域を参照するようにアドレス解決する。ということなのでしょうね。


No.215Re: perlのグローバル変数
2020/09/29(Tue) 16:27:43
Name清水31

以下のサイトを見つけた。
requireは動的リンクのようである。

[技術継承の現場] useとrequireの違い
http://www.ndis.co.jp/blog/tech/2008/10/use-require.html

うーん、スクリプト言語に動的リンクがあるとは驚きでした。高級ではあるがスパゲッティを生みやすい仕様ですね。


- YY-BOARD -