4

Perl5のプラグマオーバーロードについて読んでいるときに、演算子に気づきました*{}

*どんな種類の印章があるか、または*参照コンテキストでの意味を知りたいです。

4

2 に答える 2

4

typeglobを指します。あらゆるタイプを参照できます。それらは現在ほとんどレガシーです。

于 2012-04-13T09:58:12.413 に答える
3

*fooは「typeglob」、または略して「glob」です。グロブは(Cのように)、、、などの名前のフィールドを持つ構造体です。structこれらARRAYのフィールドには、何も含まれていないか、参照が含まれています。Perlコードの観点からは、それらは非常に特別なハッシュのように見えます。HASHIO

グロブの主な目的は、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で明示的に使用されることはめったにありません。唯一の例外は、古いスタイルのファイルハンドルです。たとえば、FILEandSTDOUTは実際には*FILEand *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オブジェクトをハッシュベースのオブジェクトにすることができます。

于 2012-04-13T18:37:43.653 に答える