- ベストアンサー
myになっている理由
- myが付いている項目と付いていない項目があるが、その理由は何か?
- myはブロック{}の中で宣言され、その中だけで有効とされるが、箱庭のスクリプトでmyを使っている変数が{}の範囲外にあるのはなぜか?
- 箱庭のスクリプトで各種設定のmyを取り除いたが問題なく動作しているが、それはなぜか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> つまり、myで宣言したものの有効範囲はファイル全体であって > requireで読み込まれるスクリプトには適用されない。 > myで宣言していない変数はファイル全体とrequireで > 読み込まれるスクリプトにも共通のものが適用される。 > ということで基本的にはあってますか? すみません。ちょっと誤解を招く書き方でした。 あるファイル vincent.pl があったとします #!/usr/bin/perl require 'inc.pl'; my $var1; sub mogera { my $var2; foreach (@ARGV) { my $var3; } } このとき、$var1 の有効範囲は vincent.pl全体に及びます。 $var2 はサブルーチン mogera の中だけです。 そして $var3 は foreach の中だけで有効です。 その変数を囲む最も小さなブロックの範囲で有効であり、最大でファイル全体ということです(厳密には違うのですが話が長くなるので省略します)。 ですから、$var1, $var2, $var3 のいずれも inc.pl の中から見ることはできません。 明確に宣言されていない変数はグローバル変数になりますので、inc.plからでも 参照することができるわけです。 最初は面倒に思われるかもしれませんが、変数は宣言して使うようにしておくと 変数名を間違えてタイプしてしまったときなどに悩まなくてすみます。 use strict というプラグラマを使うと、この宣言を強制することができます。
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
my の有効範囲は { } のブロックの内側だけではありません。 あるファイルの中でmy $var としたとき、その有効範囲はファイル全体に及びます。 A "my" declares the listed variables to be local (lexically) to the enclosing block, file, or "eval". If more than one value is listed, the list must be placed in parentheses. 問題のスクリプトを見ていましたが、途中で条件に応じて特定のファイルを require していますね。 おそらく、読み込む側のスクリプトと読み込まれる側のスクリプトとで共通のものを使いたい変数が my で宣言されていないものだと思います。 こういう場合、use vars とか our とか使って宣言するのが最近のスタイルです(use vars はちょっと古め)。 "our" associates a simple name with a package variable in the current package for use within the current scope. When "use strict 'vars'" is in effect, "our" lets you use declared global variables without qualifying them with package names, within the lexical scope of the "our" declaration. In this way "our" differs from "use vars", which is package scoped. Unlike "my", which both allocates storage for a variable and associates a simple name with that storage for use within the current scope, "our" associates a simple name with a package variable in the current package, for use within the current scope. In other words, "our" has the same scoping rules as "my", but does not necessarily create a variable. お金を出して本を買ってもいいというのなら、「Perl ベストプラクティス」を 読んでみると得られることは多いと思います。 http://www.oreilly.co.jp/books/4873113008/ ちょっと高いですけどね(4515円)。
お礼
ありがとうございます。 つまり、myで宣言したものの有効範囲はファイル全体であって requireで読み込まれるスクリプトには適用されない。 myで宣言していない変数はファイル全体とrequireで 読み込まれるスクリプトにも共通のものが適用される。 ということで基本的にはあってますか? use vars や ourについては調べてみようと思います。 Perl ベストプラクティスの説明を読んでみましたがかなり 詳しく書かれているようですね。購入を検討しようと思います。
お礼
解答遅くなってしまい申し訳ありません。 ありがとうございました。