readline EXPR
readline

从包含在 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 中的每个元素,因为 eofARGV 的处理方式不同。

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 表达式用作 whilefor 循环的条件,那么它将被隐式地赋值给 $_。如果 readline 表达式或显式地将 readline 表达式赋值给标量用作 while/for 条件,那么条件实际上测试的是表达式的值的定义性,而不是其常规的真值。