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

raj*_*eev 13 perl filehandle

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

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

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

while (<FH>)
{
    # ...do something
}
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*ell 21

使用seek回到文件的开头:

seek FH, 0, 0;
Run Code Online (Sandbox Code Playgroud)

或者,更冗长:

use Fcntl;
seek FH, 0, SEEK_SET;
Run Code Online (Sandbox Code Playgroud)

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


TLP*_*TLP 5

你有几个选择.

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