在 IO::CatHandle 中§

有关方法 eof,请参阅上下文中的主要文档

method eof(IO::CatHandle:D: --> Bool:D)

如果读取操作已耗尽源句柄队列(包括最后一个句柄的内容),则返回 True注意:调用此方法可能会导致一个或多个 .on-switch 调用,同时检查源句柄队列,并且 源句柄队列可能会被耗尽

(my $f1 = 'foo'.IO).spurt: 'foo';
(my $f2 = 'bar'.IO).spurt: 'bar';
with IO::CatHandle.new: :on-switch{ print 'SWITCH! ' }$f1$f2 {
                   # OUTPUT: «SWITCH! » 
    .eof.say;      # OUTPUT: «False␤» 
    .readchars(3);
    .eof.say;      # OUTPUT: «SWITCH! False␤» 
 
    .slurp;        # OUTPUT: «SWITCH! » 
    .eof.say;      # OUTPUT: «True␤» 
}

适用于 IO::Handle.eof 的关于不可查找句柄和空文件的相同注意事项也适用于此处。

在 IO::Handle 中§

请参阅上下文中的主要文档,了解eof 方法

method eof(IO::Handle:D: --> Bool:D)

非阻塞。如果读取操作已读取完句柄的内容,则返回 True。对于可查找的句柄,这意味着当前位置位于文件末尾或超出文件末尾,并且查找已读取完的句柄回到文件内容中将导致eof再次返回 False

不可查找的句柄和打开到零大小文件(包括 /proc/ 中的特殊文件)的句柄上,在读取操作无法读取任何字节之前,不会设置 EOF。例如,在此代码中,第一个 read 会消耗所有数据,但只有在第二个 read 未读取任何内容时,才会设置 TTY 句柄上的 EOF

$ echo "x" | raku -e 'with $*IN { .read: 10000; .eof.say; .read: 10; .eof.say }'
False
True