【问题标题】:Re-reading from already read filehandle从已读取的文件句柄中重新读取
【发布时间】:2012-08-20 19:08:36
【问题描述】:

我打开一个文件逐行读取:

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

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

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

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

【问题讨论】:

    标签: perl filehandle


    【解决方案1】:

    使用 seek 倒退到文件的开头:

    seek FH, 0, 0;
    

    或者,更冗长:

    use Fcntl;
    seek FH, 0, SEEK_SET;
    

    请注意,如果您必须搜索输入,这会极大地限制您的工具的实用性,因为它永远不能用作过滤器。能够从管道中读取是非常有用的,并且您应该努力安排您的程序,以便不需要查找。

    【讨论】:

      【解决方案2】:

      你有几个选择。

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

      【讨论】:

      • 关于 Tie::File 我注意到 stackoverflow 上关于 BerkeleyDB 的评论(丢失的链接) - 在读取非常大的文件的情况下,没有立即将它们放入 RAM。我觉得,现在寻找就足够了。再次感谢!
      • @rajeev 这是一个非常好的模块,它是 v5.7.3 核心安装的一部分。我会说“标准”解决方案是简单地重新打开文件句柄。您甚至不需要先关闭文件句柄,因为这是自动完成的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多