4

ref関数のドキュメントからの関連する抜粋を次に示します。

返される値は、参照が参照されているもののタイプによって異なります。組み込み型には次のものがあります。

SCALAR
ARRAY
HASH
CODE
REF
GLOB
LVALUE
FORMAT
IO
VSTRING
Regexp

これに基づいてref、ファイルハンドルを呼び出すと が返されると想像しました'IO'。驚くべきことに、そうではありません。

use strict;
use warnings;

open my $fileHandle, '<', 'aValidFile';
close $fileHandle;

print ref $fileHandle;     # prints 'GLOB', not 'IO'

perlref理由を説明しようとします:

バックスラッシュ演算子を使用して IO ハンドル (ファイルハンドルまたはディレクトリハンドル) への真の参照を作成することはできません。得ることができるのは、実際には完全なシンボル テーブル エントリである型グロブへの参照です [...] ただし、型グロブとグロブ参照を IO ハンドルのように使用することはできます。


その場合、どのような状況でref戻るでしょう'IO'か?

4

2 に答える 2

4

IO 参照を取得する唯一の方法は、*FOO{THING} 構文を使用することです。

$ioref = *glob{IO};

ここで、glob は STDIN のような名前付き glob または $fh のような参照です。しかし、一度そのような参照を取得すると、他のスカラーと同様に、任意のデータ構造に渡したり格納したりできるため、モジュールのマーシャリングなどはそれに精通している必要があります。

glob または globref はファイルハンドルとして使用でき、含まれている IO を暗黙のうちに取得できるため、IO ref はあまり必要ありません。主な例外は次のとおりです。

use Symbol;
# replace *FOO{IO} handle but not $FOO, %FOO, etc.
*FOO = geniosym;

(geniosym は新しい半匿名 IO 参照を返し、グロブ以外の参照からグロブへの割り当ては、その特定の参照のグロブの部分にのみ割り当てられます)

于 2010-06-02T07:21:40.713 に答える
2

Konerak が言うように、答えは次の質問にあります。

Perl の ref() 関数が REF、IO、および LVALUE を返すようにするにはどうすればよいですか?

関連するスニペットは次のとおりです。

use Acme::Damn;
say 'IO:      ', ref damn *STDIN{IO}; # really prints IO

これは、参照から祝福を削除するため、本番コードでは実際に使用しないでください...

于 2010-06-02T06:47:08.017 に答える