答えて
Perlmodで覆われています。
::
は、実際にはの名前空間です。初期のPerlでは、名前空間のこの考え方が成り立た取っ前に、あなたのプログラムの中で起こって変数名の衝突を持つことができます:
ここに私のプログラムがあります:
#! /usr/bin/env perl
#use strict;
use warnings;
use feature qw(say);
require "test2.pl";
$foo = "bar";
futz_with_foo();
say $foo;
私はバーに$foo
を設定し、決してそれに触れました。 bar
を印刷しなければならないしかし、私は私のプログラムを実行すると、私が取得:test2.pl
で
$ ./test.pl
WOO WOO! I MESSED WITH FOO!
を、私は持っている:
sub futz_with_foo {
$foo = "WOO WOO! I MESSED WITH FOO!"
}
1;
何が起こったことは、両方のプログラムが同じ変数$foo
を使用していることです。この問題を回避するために、Perlはモジュールに独自の名前空間を持たせることができます。元の構文は一重引用符ですが、Perl 4の::
(正しく覚えていれば)に変更されました。引き続き一重引用符を使用できます。名前空間はpackageで宣言します。
これを理解する最善の方法は、実際の動作を確認することです。次のことを試してみてください。
これを実行する#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
our $foo = 'This is the value of $foo';
say '$foo: ' . $foo;
say '$main::foo: ' . $main::foo;
say "\$main'foo: " . $main'foo;;
say "\nSwitching to package Bar";
package Bar;
our $foo = 'This is in package Bar';
say '$foo: ' . $foo;
say '$Bar::foo: ' . $Bar::foo;
say "\nSwitching to package main again";
package main;
say '$foo: ' . $foo;
、私が手:デフォルトで
$foo: This is the value of $foo
$main::foo: This is the value of $foo
$main'foo: This is the value of $foo
Switching to package Bar
$foo: This is in package Bar
$Bar::foo: This is in package Bar
Switching to package main again
$foo: This is in package Bar
を、あなたのプログラムは、メイン名前空間に出発する。ところで、あなたはour $foo
といい、my $foo
ではないことに気づくでしょう。これは、our
が、パッケージの変数が格納されているPerlシンボルテーブルに変数を格納するためです。 my
はレキシカルスコープの宣言であり、現在は優先されています。 my
で宣言された変数は、宣言されたスコープ内にのみ存在し、そのファイルの外にあることはできません。
my
で変数を宣言するのを忘れると、エラーメッセージが表示されます。デフォルトでは
Global symbol "$foo" requires explicit package name at ...
、すべてのPerlの変数はパッケージ変数(つまり、彼らはPerlのシンボルテーブルにいる)です。 use strict
プラグマを使用すると、パッケージ変数をour
と宣言するか、変数の完全なパッケージ名を使用する必要があります。 my
で変数を宣言することで(つまり、99の40/100%の時間)、strict
を使用して、Perlを使用するときに変数を宣言するように強制します。
これが役に立ちます。
ダブルコロン演算子::
は(異なる容器に同様の名前のメソッドを区別する)部材がフォームであることをパッケージ、モジュール、またはクラスとパッケージのメンバー、モジュール、またはクラスをプレフィックスするために使用されるセパレータであります。詳細はthis pageをご覧ください。
これらはパッケージセパレータです。私は実際のコードが$SomePackage::SomeHash{'SomeKey'}
のようなものだと思う。この構文では、「パッケージ変数」、この場合はハッシュ、他のパッケージ、または完全修飾名にアクセスできます。あなたは、おそらくのようなものを見にもっと慣れている:
package SomePackage;
our %SomeHash;
$SomeHash{'SomeKey'} # do something with $SomePackage::SomeHash{'SomeKey'} here
ユースケースは、出力を制御するために、これらのパッケージ変数を使用する、Data::Dumper言うように、いくつかのモジュールを設定されています。しかし...
use Data::Dumper;
local $Data::Dumper::Sortkeys = 1;
print Dumper { c => 3, a => 1, b => 2 };
このタイプの使用法は、通常、オブジェクト指向スタイルを使用することによって回避されます。
関連項目:有名なのはMJDの記事「スコープへの対処」:http://perl.plover.com/FAQs/Namespaces.html
それは自分自身では何もありません。 SomePackage::SomeHash
は全体として識別子である。 $someVariable::QUERY{'someString'}
は、ハッシュ%someVariable::QUERY
のハッシュ要素someString
を指します。ハッシュ%someVariable::QUERY
は、パッケージsomeVariable
のハッシュ%QUERY
のフルネームです。
- 1. Perlのサブリファレンス構文
- 2. 1文字の16進数のPerl正規表現の構文
- 3. perl内の文字列の文字順
- 4. <DATA>の構文perl
- 5. 珍しいPerlの構文
- 6. Perlのカスタム文字クラス5.018
- 7. Perlアスタリスク*文字の問題
- 8. BAT:〜文字列の構文
- 9. Perl URIencodes非ラテン文字
- 10. Perlの正規表現の構文エラー
- 11. perlのバージョン固有の構文リソース
- 12. ハッシュのPerl構文エラー[連想配列?]
- 13. perlの2つの文字列とハイライト不一致文字
- 14. レイザー構文ミッシング}文字
- 15. perl:特殊文字を含む生の文字列を表示
- 16. Perl:文字列の制限文字スカラー変数
- 17. Perl:文字列内の文字を並べ替える
- 18. Android、構文解析html、文字列の文字列の問題
- 19. Perlで特殊文字と文字列を一致させる
- 20. Cの構文。文字列のコピー
- 21. Bashの文字列比較の構文
- 22. Powerbuilder dw文字列置換の構文
- 23. エスケープ文字列のMySQL構文エラー
- 24. cx_Oracle LDAP接続文字列の構文
- 25. Restrictメソッドの検索文字列構文
- 26. 複数行の文字列リテラル構文
- 27. ビジュアルスタジオコード - HTML文字列の構文ハイライト?
- 28. メソッド直後のES6構文文字列
- 29. 文字列操作アドバイスのC構文?
- 30. 大文字の挿入構文
あまりにもわかりにくく、実際にはお勧めしません...同じ目的のために、2つのコロン文字(::)の代わりに1つの引用符( ')を使用することもできます。 (Acme :: Do not libraryなどのものが生成されます)。 – runrig
@runrig、私はそれについて言及しましたが、非常に非難されたIIRCです。それを使用しないでください。 '::'はThe Way(TM)です。 –