2012-04-13 12 views

答えて

3

*fooは、「タイプグロブ」または略して「グロブ」です。グロブは、ARRAYHASHIOなどのフィールドを持つ構造体(C structのように)です。これらのフィールドには、何も参照も含まれていません。 Perlコードの観点からは、非常に特殊なハッシュのように見えます。

globの主な目的は、Perlのシンボルテーブルのエントリとしてサーバーを使用することです。シンボルテーブルは、パッケージに属するすべてのシンボルとすべての「真にグローバル」な変数(例えばSTDOUT$1など)を保持します。シンボルがなければ、何という名前のサブルーチンはないであろう、@ISA@EXPORTは存在しないないだろう、とどちらも@_$$などが[もちろん、グロブはほとんど間違いないレガシーです。]でしょう

$ perl -E' 
    our @foo = qw(a b c); 
    our %foo = (d=>4, e=>5); 
    say @{ *foo{ARRAY} }; 
    say %{ *foo{HASH} }; 
' 
abc 
d4e5 

グロブも使用されていますIOオブジェクト(ファイルハンドル)の周りのラッパーとして。 open(my $fh, ...)でもglobで$fhが生成されます。

グローはPerlで明示的に使用されることはほとんどありません。 1つの例外は古いスタイルのファイルハンドルです。たとえば、FILESTDOUTは、実際にはと*STDOUT(ファイルハンドルとして使用される)を意味します。これらの用語は、便宜上、*FILE{IO}*STDOUT{IO}です。

$ perl -e'open(FILE, "echo foo|") or die; print readline(FILE);' 
foo 

$ perl -e'open(*FILE, "echo foo|") or die; print readline(*FILE);' 
foo 

$ perl -e'open(*FILE{IO}, "echo foo|") or die; print readline(*FILE{IO});' 
foo 

、なぜあなたは*{}を上書きしたいのでしょうか?

実際にファイルハンドルなしでファイルハンドルのように見えるオブジェクトを作成する場合は、*{}を上書きすることをお勧めします。たとえば、このオーバーライドを使用して、globベースのオブジェクトの代わりにIO :: Socketオブジェクトのハッシュベースのオブジェクトを作成できます。

+0

@mgodinho、更新されました。 – ikegami

4

typeglobを指します。それは任意のタイプを参照することができます。彼らは現在ほとんどが遺産である。

+1

レガシーではありません。 'IO :: Socket'とそのサブクラスは、それぞれのsockethandleに関する設定を格納するためにtypeglobを使います。 – mob

+0

"Typeglob"(または略して "glob")は、 "シンボルテーブルエントリ"のPerlの名前です。シンボルテーブルは、パッケージに属するすべてのシンボルとすべての「真にグローバルな」変数(例えば、 '$ 1')を保持します。シンボルがなければ、名前付きサブルーチンはなく、 '@ ISA'と' @EXPORT'は存在せず、どちらも '$ _'、' @ _'、 '$$'などはありません。グローブは、 *遺産ではありません。また、グローブは、IOオブジェクトがファーストクラスのオブジェクトであるため、レガシーな理由から、レキシカルファイルハンドルを含むIOオブジェクト(ファイルハンドル)をラップするためにも使用されます。 – ikegami

+0

@mob、グロブはレガシーではありませんが、あなたのコメントはグロブがレガシーであることに対する有効な議論ではありません。彼らはIO :: Socketがglobを使用するのはIOオブジェクトがそれらにラップされているためです。これは従来の理由から可能性があるため、IO :: Socketは従来の理由でこれを行う可能性があります。 – ikegami

関連する問題