Perl5のプラグマオーバーロードについて読んでいるときに、演算子に気づきました*{}
。
*
どんな種類の印章があるか、または*
参照コンテキストでの意味を知りたいです。
Perl5のプラグマオーバーロードについて読んでいるときに、演算子に気づきました*{}
。
*
どんな種類の印章があるか、または*
参照コンテキストでの意味を知りたいです。
typeglobを指します。あらゆるタイプを参照できます。それらは現在ほとんどレガシーです。
*foo
は「typeglob」、または略して「glob」です。グロブは(Cのように)、、、などの名前のフィールドを持つ構造体です。struct
これらARRAY
のフィールドには、何も含まれていないか、参照が含まれています。Perlコードの観点からは、それらは非常に特別なハッシュのように見えます。HASH
IO
グロブの主な目的は、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
Globsは、IOオブジェクト(ファイルハンドル)のラッパーとしても使用されます。グロブでさえもopen(my $fh, ...)
移入します。$fh
グロブがPerlで明示的に使用されることはめったにありません。唯一の例外は、古いスタイルのファイルハンドルです。たとえば、FILE
andSTDOUT
は実際には*FILE
and *STDOUT
(ファイルハンドルとして使用される場合)を意味します。これは、用語で*FILE{IO}
andを取得するために使用されます*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
では、なぜオーバーライドしたいの*{}
ですか?
*{}
実際にはファイルハンドルではなく、ファイルハンドルのように見えるオブジェクトを作成する場合は、オーバーライドする必要があります。たとえば、このオーバーライドを使用して、グロブベースのオブジェクトの代わりにIO::Socketオブジェクトをハッシュベースのオブジェクトにすることができます。