【发布时间】:2010-11-23 22:58:28
【问题描述】:
在 perl 中使用 运算符达到 eof 后会发生什么?
我正在逐行阅读INP1
while(<INP1>) {
}
但我需要多次读取,并且每次都需要从文件的开头开始。我怎样才能做到这一点?有没有类似在 perl 中刷新流的东西?
提前致谢。
【问题讨论】:
标签: perl file-io filestream
在 perl 中使用 运算符达到 eof 后会发生什么?
我正在逐行阅读INP1
while(<INP1>) {
}
但我需要多次读取,并且每次都需要从文件的开头开始。我怎样才能做到这一点?有没有类似在 perl 中刷新流的东西?
提前致谢。
【问题讨论】:
标签: perl file-io filestream
如果INP1 连接到常规文件句柄(不是套接字句柄或管道句柄),您也可以seek 回到文件开头。
while(<INP1>) {
...
}
seek INP1, 0, 0;
# do it again
while (<INP1>) {
...
}
另一种选择是将整个文件加载到一个数组中,然后根据需要循环遍历该数组。如果整个文件可以在内存中舒适地放置,并且文件的内容不会在遍历之间发生变化,那么这是一个好主意。
open INP1, '<', $the_file;
@INP1 = <INP1>;
close INP1;
foreach (@INP1) {
...
}
# do it again
foreach (@INP1) {
...
}
【讨论】:
你可以seek回到开头:
use Fcntl;
open INP1, ...
while (<INP1>) {
}
seek INP1, 0, SEEK_SET;
while (<INP1>) {
}
只有当 INP1 是一个真实文件(不是管道或套接字)时,这才能正常工作。
【讨论】:
use strict、use warnings qw<FATAL all>、use autodie、use open qw< :std IO :utf8 >、END{close STDOUT} 和明确的close INP1 开头。比如,你知道吗? :(
open 的任何外观都是次要的;错误检查是三次噪声。此外,适当的错误响应取决于应用程序,因此货物错误检查也不正确(尽管平均而言它可能会导致更好的代码)。最后,“最佳实践”发生了变化。例如即使文档有open or die,也有人希望将其更改为use autodie。