- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perlで use strict して our変数)
Perlでuse strictしてour変数
このQ&Aのポイント
- Perl初心者のため、use strictを書きたいけれど、our変数を参照する方法がわかりません。
- test_main.plでtest_sub.plで宣言した変数を参照するとエラーが出ます。our($hoge)を宣言したり、print $main::hoge;とパッケージを指定すると動くようになります。
- 継承のようなことをしたいため、どのようにすればいいか教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
端的に言えば「our するなりパッケージで修飾するなりしてください」となります. 詳細はこんな感じ: このエラーはコンパイル時のエラーであって実行時のエラーではありません. つまり, 実行に先立つコンパイルのときに「use strict が有効なのに my も our も state もされていない (かつパッケージ名での修飾もされていない) 変数 $hoge が現れた」というエラーです. 「require されたファイルの中に our がある」のは確かですが, 次の 2つの理由によりそれは影響しません: ・use とは異なり, require によるファイルの取り込みは実行時に行われます. つまり require 'test_sub.pl'; とあってもコンパイラは test_sub.pl の中は見ません. したがって「test_sub.pl の中の our」はコンパイル時には影響を与えません. ・また, our の有効範囲はレキシカルスコープに制限されています. そして「1つのソースファイル」はレキシカルスコープとなりますから, require をコンパイル時に行っても「test_sub.pl の中の our」は test_sub.pl の中 (もちろん our 以降の) でしか有効ではありません. 余談ですが, use strict もレキシカルスコープで有効となります. つまり, 「test_sub.pl の中の use strict」はそれを require した test_main.pl では無効です (し, 逆に require する前に test_main.pl で use strict してもそれは test_sub.pl には影響しません)
お礼
> 端的に言えば「our するなりパッケージで修飾するなりしてください」となります. やはりそうですか… ありがとうございます。 # パッケージで装飾のほうが良いかな… test_sub のほうで変数名変えられたりすると危ないし # どうせパッケージで装飾するなら main じゃなくてちゃんと package 宣言しようかな 説明していただいた内容もすごくわかりやすかったです。 > use とは異なり, require によるファイルの取り込みは実行時に行われます これについてはちらっと見かけたので use test_sub; にしてみたりもしたのですが エラーが取れずもやもやしていました。が > また, our の有効範囲はレキシカルスコープに制限されています. > そして「1つのソースファイル」はレキシカルスコープとなりますから ... この辺が絡んでくるのですね。理解しました。 とても助かりました。ありがとうございます m(_ _)m