2016-11-27 55 views
1

perl -f ref列出的名称都不是用于文件句柄。下面的代码返回GLOB,所以看起来文件句柄被内部映射到或者作为一个typeglob被管理。那是对的吗?什么是Perl中的文件句柄的内置名称?

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

一个文件句柄有它自己的类型名吗?

回答

9

一个文件句柄有它自己的类型名吗?

IO

$ 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对象可以具有与它相关联的三个手柄:一个输入文件句柄,一个输出文件句柄,目录句柄(例如,使用opendir创建)。通常,只有一个输入和输出句柄被设置,或者它们都被设置为相同的句柄。做open(FOO, ...); opendir(FOO, ...); <FOO>; readdir(FOO);将工作正常,因为单独的文件和目录句柄。

它似乎将文件句柄内部映射到或作为类型库进行管理。那是对的吗?

文件和目录IO对象通常封装在glob中,是的。 但这不是必需的。

$ 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

一个用于输入(读取)和一个用于输出(写入)。我不知道他们是否会有所不同,除非一个人为空。 – ikegami

+0

你如何让他们中的一个为空? – melpomene