在Perl中读取文件时如何跳过行?

在Perl中读取文件时如何跳过行?,perl,Perl,我该怎么做 open FILE, $somefile; foreach (<FILE>) { if (/some_regex/) { $want_the_next_line = <FILE>; $want_the_next_line_after_that = <FILE>; } } 打开文件,$somefile; foreach() { if(/some_regex/) { $want_下一行=; $want_后面的

我该怎么做

open FILE, $somefile;
foreach (<FILE>)
{
   if (/some_regex/)
   {
      $want_the_next_line = <FILE>;
      $want_the_next_line_after_that = <FILE>;
   }
}
打开文件,$somefile;
foreach()
{
if(/some_regex/)
{
$want_下一行=;
$want_后面的下一行=;
}
}
知道我的意思吗?我基本上想在我的前段中间的一行中啜饮,而不是每次回忆我的状态并检查它。我目前在Perldoc找不到任何有用的东西

哦,顺便说一下,我真的不想:

@file = <FILE>;
@file=;

我相信您理解。

使用
while
而不是
foreach

open FILE, $somefile;
while (<FILE>)                      # <<-- HERE
{
   if (/some_regex/)
   {
      $want_the_next_line = <FILE>;
      $want_the_next_line_after_that = <FILE>;
   }
}
打开文件,$somefile;

while()#您可以使用perlfaq5中相同的技术:如何更改、删除或插入文件中的行,或追加到文件的开头


(布莱恩·福伊撰稿)

插入、更改或删除文本文件中的行的基本思想包括读取并打印文件到要进行更改的位置,进行更改,然后读取并打印文件的其余部分。Perl不提供对行的随机访问(特别是因为记录输入分隔符$/是可变的),尽管Tie::File等模块可以伪造它

执行这些任务的Perl程序的基本形式是打开文件,打印其行,然后关闭文件:

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

while( <$in> )
    {
    print $out $_;
    }

    close $out;
要备份infle.txt,请为-i提供要添加的文件扩展名:

perl -pi.bak -e 's/Fred/Barney/' inFile.txt
要仅更改第五行,可以添加测试检查$,输入行号,然后仅在测试通过时执行操作:

perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt
要在某一行之前添加行,可以在Perl打印$之前添加一行(或多行!):

perl -pi -e 'print "Put before third line\n" if $. == 3' inFile.txt
您甚至可以在文件的开头添加一行,因为当前行打印在循环的末尾:

perl -pi -e 'print "Put before first line\n" if $. == 1' inFile.txt
要在文件中已有的一行之后插入一行,请使用-n开关。它与-p类似,只是它不会在循环结束时打印$,所以您必须自己打印。在这种情况下,请先打印$,然后打印要添加的行

perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
要删除行,请仅打印所需的行

perl -ni -e 'print unless /d/' inFile.txt

    ... or ...

perl -pi -e 'next unless /d/' inFile.txt

我不明白。除非你的意思是while,而不是foreach,你正在读取整个文件,如果有内存问题的话。是的,我是指foreach,就像你在下面提到的&David所说的,我是以数组的形式读取整个文件的,这正是我不想要的。你知道,我完全忘记了这一点。谢谢,先生。你太棒了。那么晚了你在干什么现在是欧洲早上9点35分。欢迎来到全球化。一个警告:与foreach不同,while会删除$\ux,因此您可能需要事先“local$\ux;”。实际上,foreach需要一个列表,while会评估其条件是否为假值。“负”值,如-1,实际上是真的。@Jon:当然,不要在30行的脚本中费心了。在更大的项目中,始终确保函数不碰撞$(或任何其他全局状态)的好处在于,您不必考虑从任何地方调用它们是否安全--即使是最内部的循环。基本上,它删除了一种您需要记住的关于函数的信息。
perl -pi -e 's/Fred/Barney/' inFile.txt
perl -pi.bak -e 's/Fred/Barney/' inFile.txt
perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt
perl -pi -e 'print "Put before third line\n" if $. == 3' inFile.txt
perl -pi -e 'print "Put before first line\n" if $. == 1' inFile.txt
perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
perl -ni -e 'print unless /d/' inFile.txt

    ... or ...

perl -pi -e 'next unless /d/' inFile.txt