プラグラムPerl5のオーバーロードについて読んでいる間、私はオペレータ*{}
に気づいた。'* {}'は有効なPerl5逆参照演算子(perldoc:overload)のようです。それはどのように逆参照されますか?
*
がどのようなものか、またはrefの文脈で*
の意味があるかどうかを知りたいと思います。
プラグラムPerl5のオーバーロードについて読んでいる間、私はオペレータ*{}
に気づいた。'* {}'は有効なPerl5逆参照演算子(perldoc:overload)のようです。それはどのように逆参照されますか?
*
がどのようなものか、またはrefの文脈で*
の意味があるかどうかを知りたいと思います。
*foo
は、「タイプグロブ」または略して「グロブ」です。グロブは、ARRAY
、HASH
、IO
などのフィールドを持つ構造体(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つの例外は古いスタイルのファイルハンドルです。たとえば、FILE
とSTDOUT
は、実際にはと*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オブジェクトのハッシュベースのオブジェクトを作成できます。
@mgodinho、更新されました。 – ikegami
typeglobを指します。それは任意のタイプを参照することができます。彼らは現在ほとんどが遺産である。
レガシーではありません。 'IO :: Socket'とそのサブクラスは、それぞれのsockethandleに関する設定を格納するためにtypeglobを使います。 – mob
"Typeglob"(または略して "glob")は、 "シンボルテーブルエントリ"のPerlの名前です。シンボルテーブルは、パッケージに属するすべてのシンボルとすべての「真にグローバルな」変数(例えば、 '$ 1')を保持します。シンボルがなければ、名前付きサブルーチンはなく、 '@ ISA'と' @EXPORT'は存在せず、どちらも '$ _'、' @ _'、 '$$'などはありません。グローブは、 *遺産ではありません。また、グローブは、IOオブジェクトがファーストクラスのオブジェクトであるため、レガシーな理由から、レキシカルファイルハンドルを含むIOオブジェクト(ファイルハンドル)をラップするためにも使用されます。 – ikegami
@mob、グロブはレガシーではありませんが、あなたのコメントはグロブがレガシーであることに対する有効な議論ではありません。彼らはIO :: Socketがglobを使用するのはIOオブジェクトがそれらにラップされているためです。これは従来の理由から可能性があるため、IO :: Socketは従来の理由でこれを行う可能性があります。 – ikegami
参照:http://stackoverflow.com/questions/4865447/demystifying-the-perl-glob –