我有一个信号文件,每行以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/);
}
文件很大,所以我不想啜饮。
答案 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
<强>的变化:强>
open my $fh, '<', $filename or die $!
/^1/
OUTER
。 next
和last
仅影响最内层循环(请参阅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/;
}
}