从包含在 EXPR 中的类型全局变量所代表的文件句柄中读取(如果未提供 EXPR,则从 *ARGV
中读取)。在标量上下文中,每次调用都会读取并返回下一行,直到到达文件末尾,此时后续调用将返回 undef
。在列表上下文中,读取直到到达文件末尾,并返回一个包含行的列表。请注意,此处使用的“行”的概念是您可能使用 $/
(或 English 中的 $INPUT_RECORD_SEPARATOR
)定义的任何内容。请参阅 "$/" in perlvar。
当 $/
设置为 undef
时,当 readline
处于标量上下文(即文件吞噬模式)时,以及当读取空文件时,它第一次返回 ''
,随后返回 undef
。
这是实现 <EXPR>
运算符的内部函数,但您可以直接使用它。<EXPR>
运算符在 "I/O Operators" in perlop 中有更详细的讨论。
my $line = <STDIN>;
my $line = readline(STDIN); # same thing
如果 readline
遇到操作系统错误,$!
将被设置为相应的错误消息。在读取来自你不信任的文件句柄(例如 tty 或套接字)时,检查 $!
可能会有所帮助。以下示例使用 readline
的运算符形式,如果结果未定义则会终止。
while ( ! eof($fh) ) {
defined( $_ = readline $fh ) or die "readline failed: $!";
...
}
请注意,你无法使用 ARGV
文件句柄以这种方式处理 readline
错误。在这种情况下,你必须自己打开 @ARGV
中的每个元素,因为 eof
对 ARGV
的处理方式不同。
foreach my $arg (@ARGV) {
open(my $fh, $arg) or warn "Can't open $arg: $!";
while ( ! eof($fh) ) {
defined( $_ = readline $fh )
or die "readline failed for $arg: $!";
...
}
}
与 <EXPR>
运算符类似,如果 readline
表达式用作 while
或 for
循环的条件,那么它将被隐式地赋值给 $_
。如果 readline
表达式或显式地将 readline
表达式赋值给标量用作 while
/for
条件,那么条件实际上测试的是表达式的值的定义性,而不是其常规的真值。