【问题标题】:How to get back to the beginning of a file in a perl one-liner?如何在 perl 单行中回到文件的开头?
【发布时间】:2018-10-09 21:44:44
【问题描述】:

浏览过一次文件后,我想回到文件的开头并根据我原来的遍历文件删除条目,但我不知道如何回到文件的开头。我有单行输入文件的名称,但没有文件句柄。我需要有文件句柄吗?如何从文件名中获取?

谢谢。

【问题讨论】:

  • 你能展示一下单线吗?有几种可能的方式来处理文件,seeking 可能会也可能不会。
  • my $command = 'perl -pi.bak -e \'my %commits;我的@commits_to_delete;我的@commits_to_edit; $/="============================================== ===================="; if ($. == 2) { # 由于字符限制删除了代码。 } # 我想回到这里的文件。我只从第一个开始工作“=========================================== =======================”到第二个。 } \'RELEASE_LOG_EXAMPLE.bak';
  • -i 没有简单的搜索方法。
  • 如果您尝试在现有的 Perl 程序中运行这个 oneliner,请考虑改用 Path::Tiny's edit_lines_utf8,它在实现和目的上与 perl -i 开关相似。但是由于您需要四处寻找edit_utf8,因此可以改为将整个文件作为字符串进行操作。
  • @choroba 我看到了一个问题,但它对我有用(见答案)

标签: perl filehandle


【解决方案1】:

文件句柄是ARGV。虽然-i 可能会提出关于搜索的问题,但它在我的测试中有效

perl -i.bak -pe'
    $_ = "line: $_"; 
    if ($. == 2) { seek ARGV, 0, 0 }
' test.txt

如果您发现 -i 或备份(我没有)在没有它们的情况下运行并手动执行。

使用-p switch,每次都会打印$_。注释中显示的代码使用它,但问题似乎暗示并非每一行都需要打印,因为它希望从一开始就“删除条目”。如果是这种情况,则使用-n 而不是-p,这也会打开文件并遍历其行但不打印。然后根据需要添加打印语句。

阅读I/O Operators in perlop 通常是一个非常好的主意,一旦你对此感到困惑,我真的会推荐它。

似乎有更好的方法可以解决您的问题,但我们需要更多细节。

【讨论】:

  • 您不能“取消打印”第一遍打印的行。将需要 -n
  • @choroba 是的,但他们在评论中给出了-p。我希望得到反馈。添加评论,谢谢。
猜你喜欢
  • 2011-05-22
  • 2011-01-20
  • 2020-10-31
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多