strictプラグマがグローバル変数を使用するためにアクティブな場合、またはstrictがオフの場合に通常のグローバル変数とは異なるいくつかの特別な機能に使用される場合にのみ、our
修飾子が使用されますか?Perlで定義された変数と通常のグローバル変数には違いがありますか?
答えて
はい、our
の宣言は、宣言されていないグローバルと比較して、追加の機能を持つことができます。しかし、これらはほとんど無関係です。
our
は、(同じ名前の)グローバル変数へのレキシカルエイリアスを作成します。つまり、package Foo
では、our $bar
と$Foo::bar
は同じ変数を示します。しかし、前者は厳密なレキシカルスコープでしか利用できません。 our
は字句効果があるとして
、別名もmy
でレキシカル変数をシャドウすることができます
our $foo = 42; # give some value
my $foo = -1; # same name, different value
say "my gives $foo";
our $foo; # reintroduce the alias; shadow lexical
say "our gives $foo";
をあなたはour
宣言を除去し、厳格なしでそれを実行した場合、これは明らかに出力を与えることはありません
my gives -1
our gives 42
my
のように、our
は、少し余分な宣言構文をとることができます。は属性:
use threads::shared;
our $foo :shared;
またfields
プラグマでの使用のためのタイプを指定することができます。
our Foo $foo;
これはour
せずに、グローバル変数のために行うことはできません。
あなたがperldocsからわかるように、our
は、現在のパッケージでour
編変数と同じ名前のパッケージ変数にエイリアスを作成します。
複数のパッケージ定義を持つコードを書く場合は、our
ed変数を使用して、モジュール間でエイリアス化された変数を渡すことができます。
package Foo:
our $bar = 42; # $bar is an alias for $Foo::bar
package Baz;
print $bar; # prints '42', since $bar is $Foo::bar
このように、グローバル変数とは何の関係もありません。
グローバル変数は、strict
のどちらかに、どこにでもアクセスできます。完全修飾名を指定すると、パッケージ名に接頭辞を付けます。だからいつでもどこでも$main::variable
にアクセスできます。
my
と宣言していない$variable
にアクセスすると、Perlはそれが現在のパッケージのパッケージ変数であるとみなします。 our
は、明示的にパッケージ変数を宣言するために使用できますが、strict
を指定しないと、宣言されていないものと同じように動作します。
strict
を使用すると、our
で宣言された変数は、宣言が現れたレキシカルスコープ内で、ローカル名と完全修飾名を使用してアクセスできます。つまり、2つのサブルーチンからグローバル変数にアクセスするには、両方のサブルーチン内で宣言するか、その両方を外側のスコープで宣言する必要があります。
- 1. winformsで定義されたグローバル変数が正常に動作しない
- 2. NameErrorは:グローバル名が別の.pyファイルで定義されたグローバル変数で定義されていない
- 3. JavaScriptの結果のグローバル変数は、常に定義されていません
- 4. グローバル関数変数が定義されていません
- 5. JavaScriptのグローバル変数、変数なしで定義された変数
- 6. クラス変数とクラスレベルで定義された変数との違い
- 7. 通常の変数とRubyのインスタンス変数との違いは何ですか?
- 8. Python:グローバル名は定義されていません(しかし、グローバル変数ではありません)
- 9. href perl変数を通常のスカラ変数に変換する
- 10. クラス変数とグローバル変数の違いは何ですか?
- 11. ローカル変数とグローバル変数の違い
- 12. グローバル変数が定義されていないと表示されます
- 13. グローバル変数はCの自動変数にありますか?
- 14. 角4:グローバル変数は定義されていません
- 15. React-nativeグローバル変数は定義されていません
- 16. 変数が定義されていても変数が定義されていても未定義変数
- 17. Javascript:グローバル変数は他の関数で定義されていません
- 18. constとarrowで定義されたJavaScript関数と正規関数の間に違いはありますか?
- 19. ionicframeworkインポートモジュール、変数は常に定義されていません
- 20. Perlグローバル変数が初期化されていません
- 21. Pythonグローバル変数定義トラブルシューティング
- 22. グローバル変数はwebpackからのtypescriptで定義されていません
- 23. C異なるファイルで定義された同じグローバル変数
- 24. ダブルコロンとグローバル変数の違いは?
- 25. 変更された変数を取得しない関数です。グローバルではありませんか?
- 26. 関数に設定された変数は常に変更されます
- 27. perlでグローバル変数を使うには?
- 28. グローバル変数オブジェクトキーが定義どおりに表示されない
- 29. グローバル変数が明確に定義されていると「グローバルが定義されていません」というエラーが表示される
- 30. インポート/エクスポートモジュールでのJavaScriptの問題とグローバルに定義された変数
本当に良い答えです! – none