使用forl for for循环遍历perl中的文件

时间:2014-07-21 14:00:39

标签: perl file iteration

如果for返回文件的完整列表然后对其进行迭代,如何在不使用next命令的情况下跳过文件行?

就像这样的数组

my @lines = ('first line', 'second line', 'third line');
for (my $i=0; $i<=$#lines; $i++){
   print $lines[$i];
   $i++;
}

输出:first linethird line;

是否可以对文件执行相同操作而不将其推入数组?

3 个答案:

答案 0 :(得分:1)

  

如何在不使用下一个命令的情况下跳过文件行?

使用你拥有的代码,你可以在那里使用一个计数器,并在每次迭代后递增它,并执行类似

的操作
if($counter == 2){
#do nothing
}
else{
    print $lines[$i];
}

所以在你的代码中做

for (my $i=0; $i<=$#lines; $i++){
   if($i == 1){
      #do nothing
   }
   else{
      print $lines[$i];
   }
}

  

甚至可以对文件执行相同操作而不将其推入   一个数组?

使用文件句柄打开文件

open (my $fh, "<", $filename) or die $!;

然后逐行阅读

while(my $line = <$fh>){
   #work on line, apply some condition here to skip. for eg
   if ($line =~ /sometext/){
       #skip it using next or empty if block etc.
   }
   else{
       #work on it
   }
}

另见:How can I skip lines when slurping a file in Perl?

答案 1 :(得分:1)

$i++;的要点是跳过元素。最接近的等价物:

while (my $line = <$fh>) {
   print;

   # Skip a line.
   last if !defined($line = <$fh>);
}

目前尚不清楚你要做什么。如果你想跳过偶数行,我会选择

while (my $line = <$fh>) {
   next if $. % 2 == 0;   # Skip even lines
   print;
}

哦等等,你说没有next

while (my $line = <$fh>) {
   if ($. % 2) {
      print;
   }
}

答案 2 :(得分:0)

  

我有一个巨大的文件,在某些行中它必须跳过30行甚至可能我必须回到某些行... aaand我不知道行号,所以@ Chankey的方法不适合我

您可以照常阅读文件并自由使用next命令:

open(my $fh, "filename") || die "Cant open file: $!";
while( defined(my $line = <$fh>) ) {
   next if $line =~ /blablabla/;
   #...
}

如果您希望能够返回某些行,我更愿意使用带有文件偏移量的数组,并在需要时调用seek。因此,您永远不会将整个文件读入内存并仅在内存中保留“行号=&gt;偏移”数组,这可以通过不同方式进行优化。模板可以如下所示:

my $curr_line=0;
my @offsets = (0); #0th line has offset 0
open(my $fh, "filename") || die "Cant open file: $!";
while( defined(my $line = <$fh>) ) {
   $offsets[++$curr_line] = tell($fh); #Save line-number => offset
   next if $line =~ /blablabla/;
   if( $line =~ /^return-line: (\d+)/ && $1>0 ) { #A logic which wants to go back to $1-th line
      $curr_line=$1-1;
      seek($fh, $offsets[$curr_line], 0);
      next;
   }
   #...
}