2016-11-27 4 views
1

perl -f refにリストされている名前のいずれもファイルハンドルのようです。次のコードはGLOBを返します。そのため、ファイルハンドルは内部的に型グロブにマッピングされているか、または型グロブとして管理されているようです。あれは正しいですか?Perlのファイルハンドルの組み込み名は何ですか?

open FH, '>', "out.txt"; 
my $ref = \*FH; 
print "ref \$ref:", ref $ref, "\n"; 

ファイルハンドルには独自のタイプ名がありますか?

答えて

9

ファイルハンドルには独自のタイプ名がありますか?

IO。入力ファイルハンドル、出力ファイルハンドル、およびディレクトリハンドル(例えばopendirを使用して作成):

$ perl -MDevel::Peek -e'Dump(*STDOUT{IO});' 
SV = IV(0x3ba7118) at 0x3ba7128 
    REFCNT = 1 
    FLAGS = (TEMP,ROK) 
    RV = 0x3bc4390 
    SV = PVIO(0x3bc8668) at 0x3bc4390 
    REFCNT = 3 
    FLAGS = (OBJECT) 
    STASH = 0x3bc3fa0 "IO::File" 
    IFP = 0x3bbe180 
    OFP = 0x3bbe180 
    DIRP = 0x0 
    LINES = 0 
    PAGE = 0 
    PAGE_LEN = 60 
    LINES_LEFT = 0 
    TOP_GV = 0x0 
    FMT_GV = 0x0 
    BOTTOM_GV = 0x0 
    TYPE = '>' 
    FLAGS = 0x0 

技術、IOオブジェクトは、それに関連付けられた3つのハンドルを有することができます。通常、入力ハンドルと出力ハンドルのどちらか一方のみが設定されているか、または両方が同じハンドルに設定されています。 open(FOO, ...); opendir(FOO, ...); <FOO>; readdir(FOO);を実行すると、別々のファイルとディレクトリハンドルのために正常に動作します。

ファイルハンドルが内部的にマップされているか、またはタイプグロブとして管理されているようです。あれは正しいですか?

通常、ファイルとディレクトリのIOオブジェクトはグロブにカプセル化されています。 しかし、それは必須ではありません。

$ perl -E' 
    my $fh = "STDOUT";  say($fh "$fh"); 
    my $fh = *STDOUT;  say($fh "$fh"); 
    my $fh = \*STDOUT;  say($fh "$fh"); 
    my $fh = *STDOUT{IO}; say($fh "$fh"); 
' 
STDOUT     # Name 
*main::STDOUT    # Glob 
GLOB(0x1175a48)   # Reference to a glob. (This is returned by open $fh) 
IO::File=IO(0x1175a60) # Reference to a (blessed) IO. 
+0

同じIOオブジェクトに入出力ハンドルを分割するにはどうすればよいですか? – melpomene

+0

入力(読み取り)用と出力(書き込み)用の1つ。 1つがnullの場合を除いて、それらが異なることができるかどうかはわかりません。 – ikegami

+0

どのようにそれらの1つをヌルにしますか? – melpomene

関連する問題