内容

名称

IO::Handle - 为 I/O 句柄提供对象方法

概要

use IO::Handle;

my $io = IO::Handle->new();
if ($io->fdopen(fileno(STDIN),"r")) {
    print $io->getline;
    $io->close;
}

my $io = IO::Handle->new();
if ($io->fdopen(fileno(STDOUT),"w")) {
    $io->print("Some text\n");
}

# setvbuf is not available by default on Perls 5.8.0 and later.
use IO::Handle '_IOLBF';
$io->setvbuf(my $buffer_var, _IOLBF, 1024);

undef $io;       # automatically closes the file if it's open

autoflush STDOUT 1;

描述

IO::Handle 是所有其他 IO 句柄类的基类。它不打算直接创建 IO::Handle 的对象,而是由 IO 层次结构中的其他几个类继承 IO::Handle

如果您正在阅读此文档,寻找 FileHandle 包的替代品,那么我建议您也阅读 IO::File 的文档。

构造函数

new ()

创建一个新的 IO::Handle 对象。

new_from_fd ( FD, MODE )

创建一个 IO::Handle,就像 new 一样。它需要两个参数,它们被传递给 fdopen 方法;如果 fdopen 失败,则销毁该对象。否则,它将被返回给调用者。

方法

有关以下支持的 IO::Handle 方法的完整描述,请参见 perlfunc,这些方法只是相应内置函数的前端

$io->close
$io->eof
$io->fcntl( FUNCTION, SCALAR )
$io->fileno
$io->format_write( [FORMAT_NAME] )
$io->getc
$io->ioctl( FUNCTION, SCALAR )
$io->read ( BUF, LEN, [OFFSET] )
$io->print ( ARGS )
$io->printf ( FMT, [ARGS] )
$io->say ( ARGS )
$io->stat
$io->sysread ( BUF, LEN, [OFFSET] )
$io->syswrite ( BUF, [LEN, [OFFSET]] )
$io->truncate ( LEN )

有关以下所有支持的 IO::Handle 方法的完整描述,请参见 perlvar。它们都返回属性的先前值,并接受一个可选的单个参数,当给出该参数时将设置该值。如果未给出参数,则先前值保持不变(除了 $io->autoflush 实际上会默认打开自动刷新)。

$io->autoflush ( [BOOL] )                         $|
$io->format_page_number( [NUM] )                  $%
$io->format_lines_per_page( [NUM] )               $=
$io->format_lines_left( [NUM] )                   $-
$io->format_name( [STR] )                         $~
$io->format_top_name( [STR] )                     $^
$io->input_line_number( [NUM])                    $.

以下方法不支持按文件句柄进行操作。

IO::Handle->format_line_break_characters( [STR] ) $:
IO::Handle->format_formfeed( [STR])               $^L
IO::Handle->output_field_separator( [STR] )       $,
IO::Handle->output_record_separator( [STR] )      $\

IO::Handle->input_record_separator( [STR] )       $/

此外,要进行正常的 I/O 操作,您可能需要以下内容

$io->fdopen ( FD, MODE )

fdopen 类似于普通的 open,除了它的第一个参数不是文件名,而是文件句柄名称、IO::Handle 对象或文件描述符编号。(有关 open 方法的文档,请参见 IO::File。)

$io->opened

如果对象当前是有效的文件描述符,则返回 true,否则返回 false。

$io->getline

这与 "perlop 中的 I/O 运算符" 中描述的 <$io> 类似,只是它更易读,可以在列表上下文中安全地调用,但仍然只返回一行。但是,如果用作 while 或 C 样式 for 循环中的条件,则需要使用 defined($_ = $io->getline) 模拟 <$io> 的功能。

$io->getlines

这与在列表上下文中调用时类似于 <$io>,以读取文件中所有剩余的行,只是它更易读。如果在标量上下文中意外调用,它也会 croak()。

$io->ungetc ( ORD )

将具有给定序数值的字符推回给定句柄的输入流。每个句柄只保证一个字符的回退。

$io->write ( BUF, LEN [, OFFSET ] )

write 有点类似于 C 中的 write,因为它与 read 相反。perl write 函数的包装器称为 format_write。但是,虽然 C write 函数返回写入的字节数,但此 write 函数仅在成功时返回 true(类似于 print)。更类似于 C 的 writesyswrite(见上文)。

$io->error

如果给定的句柄自打开或自上次调用 clearerr 以来遇到任何错误,或者句柄无效,则返回真值。只有当句柄有效且没有未决错误时,它才返回假值。

$io->clearerr

清除给定句柄的错误指示器。如果句柄无效,则返回 -1,否则返回 0。

$io->sync

sync 将文件的内存状态与物理介质上的状态同步。sync 不会在 perlio api 级别运行,而是在文件描述符上运行(类似于 sysread、sysseek 和 systell)。这意味着在 perlio api 级别持有的任何数据都不会被同步。要同步在 perlio api 级别缓冲的数据,必须使用 flush 方法。sync 并非在所有平台上都已实现。成功时返回“0 但为真”,错误时返回 undef,无效句柄返回 undef。参见 fsync(3c).

$io->flush

flush 使 perl 刷新 perlio api 级别上的任何缓冲数据。缓冲区中的任何未读数据将被丢弃,任何未写数据将被写入底层文件描述符。成功时返回“0 但为真”,错误时返回 undef

$io->printflush ( ARGS )

打开自动刷新,打印 ARGS,然后恢复 IO::Handle 对象的自动刷新状态。返回 print 的返回值。

$io->blocking ( [ BOOL ] )

如果调用时带有参数,blocking 将在 BOOL 为假时打开非阻塞 IO,在 BOOL 为真时关闭非阻塞 IO。

blocking 将返回先前设置的值,或者如果未给出 BOOL,则返回当前设置。

如果发生错误,blocking 将返回 undef,并且 $! 将被设置。

如果 C 函数 setbuf() 和/或 setvbuf() 可用,则 IO::Handle::setbufIO::Handle::setvbuf 设置 IO::Handle 的缓冲策略。Perl 函数的调用序列与其 C 对应函数相同,包括用于 setvbuf() 的常量 _IOFBF_IOLBF_IONBF,只是缓冲区参数指定一个用作缓冲区的标量变量。您应该只在任何 I/O 之前或在调用 flush 之后立即更改缓冲区。

警告:IO::Handle::setvbuf() 在 Perl 5.8.0 及更高版本中默认不可用,因为 setvbuf() 非常特定于使用 stdio 库,而 Perl 更喜欢使用新的 perlio 子系统。

警告:由 `setbuf` 或 `setvbuf` 用作缓冲区的变量在任何情况下都 **不能修改**,直到 IO::Handle 关闭或再次调用 `setbuf` 或 `setvbuf`,否则可能会导致内存损坏!请记住,全局销毁的顺序是未定义的,因此即使您的缓冲区变量在程序终止之前一直存在于作用域中,它也可能在文件 IO::Handle 关闭之前变为未定义。请注意,您需要显式导入常量 `_IOFBF`、`_IOLBF` 和 `_IONBF`。与 C 语言类似,`setbuf` 不返回任何值。`setvbuf` 在成功时返回“0 但为真”,在失败时返回 `undef`。

最后,有一种特殊的方法可以在 **-T** 和 setuid/gid 脚本下工作

$io->untaint

将对象标记为无污染,因此从该对象读取的数据也将被视为无污染。请注意,这是一个非常信任的操作,应考虑数据源和潜在的漏洞。成功时返回 0,如果设置无污染标志失败则返回 -1。(例如,无效句柄)

注意

一个 `IO::Handle` 对象是对符号/GLOB 引用(参见 Symbol 包)的引用。一些从 `IO::Handle` 继承的模块可能希望在 GLOB 的哈希表部分保留与对象相关的变量。为了防止模块相互践踏,我建议任何此类模块都应该在其变量名前缀其自己的名称,并用下划线分隔。例如,IO::Socket 模块在 `io_socket_timeout` 中保留了一个 `timeout` 变量。

另请参阅

perlfunc"perlop 中的 I/O 运算符"IO::File

错误

由于向后兼容性,所有文件句柄都类似于 `IO::Handle` 类或实际上是从该类派生的类的对象。它们实际上不是。这意味着您不能从 `IO::Handle` 派生自己的类并继承这些方法。

历史

源自 Graham Barr <[email protected]> 编写的 FileHandle.pm