Perl 中文件句柄的内置名称是啥?
Posted
技术标签:
【中文标题】Perl 中文件句柄的内置名称是啥?【英文标题】:What is a built-in name for a filehandle in Perl?Perl 中文件句柄的内置名称是什么? 【发布时间】:2016-11-27 19:50:32 【问题描述】:perl -f ref 列出的名称似乎都不是文件句柄。以下代码返回 GLOB,因此文件句柄似乎在内部映射到或作为 typeglob 管理。对吗?
open FH, '>', "out.txt";
my $ref = \*FH;
print "ref \$ref:", ref $ref, "\n";
文件句柄有自己的类型名称吗?
【问题讨论】:
【参考方案1】:文件句柄有自己的类型名称吗?
IO
.
$ perl -MDevel::Peek -e'Dump(*STDOUTIO);'
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
对象可以有三个与之关联的句柄:输入文件句柄 (IFP
)、输出文件句柄 (OFP
) 和目录句柄(例如,使用 opendir
创建的, DIRP
)。通常,只设置输入和输出句柄之一,或者它们都设置为相同的句柄。由于文件和目录句柄是分开的,所以 open(FOO, ...); opendir(FOO, ...); <FOO>; readdir(FOO);
可以正常工作。
似乎文件句柄在内部被映射到或作为 typeglob 管理。对吗?
文件和目录 IO 对象通常都封装在一个 glob 中,是的。 但这不是必需的。
$ perl -E'
my $fh = "STDOUT"; say($fh "$fh");
my $fh = *STDOUT; say($fh "$fh");
my $fh = \*STDOUT; say($fh "$fh");
my $fh = *STDOUTIO; 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.
【讨论】:
如何在同一个 IO 对象中拥有不同的输入/输出句柄? 一个用于输入(读取),一个用于输出(写入)。我不知道它们是否可以不同,除非其中一个为空。 如何让其中一个为空?open my $fh, "<", ...
或者更确切地说,这使得其中一个不为空:)以上是关于Perl 中文件句柄的内置名称是啥?的主要内容,如果未能解决你的问题,请参考以下文章