Perl 读取文件的当前行和上一行

Perl 读取文件的当前行和上一行,perl,if-statement,file-io,Perl,If Statement,File Io,这是我要读取的文件: N95480 G1 X143.61 Y40.23 Z0.00 N95490 G1 X142.90 Y40.06 Z0.00 N95500 G00 Z2 N95520 G00 Z2 N120 G00 Z2 N250 G00 Z2 N550 G00 Z2 N950 G00 Z2 N1440 G00 Z2 N1980 G00 Z2 N2100 G1 X81.78 Y154.21 Z-0.01 N2550 G00 Z2 N2980 G1 X79.91 Y149.90 Z-0.01

这是我要读取的文件:

N95480 G1 X143.61 Y40.23 Z0.00
N95490 G1 X142.90 Y40.06 Z0.00
N95500 G00 Z2
N95520 G00 Z2
N120 G00 Z2
N250 G00 Z2
N550 G00 Z2
N950 G00 Z2
N1440 G00 Z2
N1980 G00 Z2
N2100 G1 X81.78 Y154.21 Z-0.01
N2550 G00 Z2
N2980 G1 X79.91 Y149.90 Z-0.01
我有以下perl代码:

$previousLine = "";
open (MYFILE, '>testdata.txt');
    while ($continue) {
        # read file content
        open(FILE, 'readfile.txt') or die "Can't read file 'filename' [$!]\n";  
        while (<FILE>) {
            $currentLine = $_;
            if ($previousLine =~ /G00 Z/ && $currentLine =~ /G00 Z/) {
                $currentLine = "";
            }
            print MYFILE $currentLine; 
            $previousLine = $currentLine;
            $currentLine = "";

        }
        close (FILE);
    }
close (MYFILE); 
所以基本上我想实现的是,如果前一行和当前行中有字符串“G00 Z”,我想将currentLine变量更改为“”。 我已经尝试为上一行单独设置ifs,它进入循环。然后我试着分别做currentLine if,它也进入了循环,但是when语句if,正如我所做的,它不起作用,而且当ifs彼此在一起时,它也不起作用,就像这样:

if ($prev...) {
    if ($current..) {
        do stuff..
    }
}

如果我理解正确,您想在多行上划掉
G00Z
的行吗?正如现在所写的,每次你找到一个被复制者时,你都会删除你的“上一行”,所以你最终会在“被复制者”和“不被复制者”之间跳跃,即使它们都应该是被复制者

您可能想要:

$currentLine = $_;
if ($previousLine =~ /G00 Z/ && $currentLine =~ /G00 Z/) {
   print MYFILE "";
} else {
   print MYFILE $currentLine;
}
$previousLine = $currentLine;
换句话说,将打印语句移动到
if()
,并根据需要输出空行/当前行


这样,在进行精细的“复制”时,您可以打印空行,并且仍然保留真正的“上一行”,而不是用假空行覆盖它。

我只需跳过打印,如:

open my $MYFILE, '>', 'testdata.txt' or die $!;
open my $FILE, '<', 'readfile.txt'   or die "Can't read file 'filename' [$!]\n";  
my $previousLine = "";
while (<$FILE>) {
    next if $previousLine =~ /G00 Z/ && /G00 Z/;
    print $MYFILE $_; 
    $previousLine = $_;
}
close $FILE;
close $MYFILE; 
打开我的$MYFILE,'>','testdata.txt'或die$!;

打开我的$FILE,'您应该使用三个arg版本的
open
<代码>打开(我的$fh,'嗨,谢谢你的回复。是的,我现在看到我实际上只是每秒钟“删除”一次副本,从而在文件中留下其他副本。我会尝试一下。谢谢。这是我问题的杀手。
open my $MYFILE, '>', 'testdata.txt' or die $!;
open my $FILE, '<', 'readfile.txt'   or die "Can't read file 'filename' [$!]\n";  
my $previousLine = "";
while (<$FILE>) {
    next if $previousLine =~ /G00 Z/ && /G00 Z/;
    print $MYFILE $_; 
    $previousLine = $_;
}
close $FILE;
close $MYFILE;