如何在Perl中一次处理两行文件?

时间:2011-11-26 11:54:48

标签: perl file

我有一个信号文件,每行以0或1开头。

如果我在下一行中有1后跟0,那么我需要处理0信号线。

>#Sample File

>0

>0

>1

>0 (process line)

>0

>1

>0 (process line)
我的代码
 OUTER : while (<F>) {
   if($_=~/1/){
     my $a = <F>
     process_line($a) if ($a=~/0/);
     next OUTER if ($a=~/1/);
   }

文件很大,所以我不想啜饮。

3 个答案:

答案 0 :(得分:4)

类似的东西:

#!/usr/bin/perl

use strict;
use warnings;
my $prevLine = "";

sub processline {
    my $line = shift;
    $line =~ s@^0 @@;
    print $line;
}

while (<DATA>) {
    if ($_ =~ /^0/ && $prevline =~ /^1/) {
        processline($_);
    }
    $prevLine = $_;
}

__DATA__
0
0
1
0 (process line)
0
1
0 (process line)

<强>输出

(process line)
(process line)

答案 1 :(得分:1)

我看到您的代码可能出现错误:以1开头的两个或多个连续行将失败并跳过匹配。

while (<>) {
   if(/^1/){            # Ignore everything except 1-lines
      while (<>) {      # Start inner loop
         next if /^1/;  # Skipping consecutive 1-lines
         die "Bad line: $_" unless /^0/;  # Anything not 1 or 0 is not allowed
         process_line($_);
         last;          # Exit inner loop, search for next 1-line
      }
   }
}

使用选项

script.pl filename        (single file)
script.pl filename*       (glob, multiple files)
some_command | script.pl

<强>的变化:

  • 全局文件句柄已更改为菱形运算符,适用于STDIN或 脚本的filename参数。如果要显式打开,请使用 open my $fh, '<', $filename or die $!
  • 在正则表达式中添加锚点以仅匹配字符串的开头,例如 /^1/
  • 删除了不必要的标签OUTERnextlast仅影响最内层循环(请参阅perldoc -f last)。
  • $_ =~ /^1/更改为/^1/,这是等效的,等等 清晰可辨。
  • 嵌套使用$_有效,并且可以按预期工作。如果你 想要,内循环可以使用另一个变量,例如while (my $line = <>),对某些人来说可能看起来不那么混乱。 (不是对我而言)

如果您还没有这样做,您应该使用严格和警告。 Why use strict and warnings?

答案 2 :(得分:0)

另一种变化:

#!/usr/bin/env perl
use strict;
use warnings;
sub processme {
    my $line = shift;
    print $line;
}
while (<>) {
    if (/^1/../^0/) {
        processme( $_ ) if /^0/;
    }
}