从已阅读的文件句柄重新读取

时间:2012-08-20 19:08:37

标签: perl filehandle

我打开了一个文件来逐行阅读:

open(FH,"<","$myfile") or die "could not open $myfile: $!";
while (<FH>)
{
    # ...do something
}

稍后在程序中,我尝试重新读取文件(再次通过文件):

while (<FH>)
{
    # ...do something
}

并意识到它就好像文件中的控件位于EOF并且不会从文件中的第一行迭代....这是默认行为吗?如何解决这个问题?文件很大,我不想将内存保存为数组。那么我唯一的选择是再次关闭并打开文件吗?

2 个答案:

答案 0 :(得分:21)

使用seek回到文件的开头:

seek FH, 0, 0;

或者,更详细:

use Fcntl;
seek FH, 0, SEEK_SET;

请注意,如果您必须搜索输入,则会极大地限制工具的实用性,因为它永远不能用作过滤器。能够从管道读取是非常有用的。请记住,57%的统计数据都是弥补的,你应该意识到,98%的寻求输入的程序都是不必要的。非常努力地处理您的数据,这样您就不需要两次读取数据。如果可能,您的程序将更有用。

答案 1 :(得分:5)

您有几个选择。

  • 重新打开文件句柄
  • 正如William Pursell建议的那样,使用seek将位置设置为文件的开头。
  • 使用Tie::File之类的模块,可以将文件作为数组读取,而无需将其加载到内存中。