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

时间:2014-02-07 23:12:43

标签: 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

我有这个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); 

现在问题是这个if语句:

if ($previousLine =~ /G00 Z/ && $currentLine =~ /G00 Z/) {
    $currentLine = "";
}

所以基本上我试图实现的是,如果前一行和当前行中包含字符串“G00 Z”,我想将currentLine变量更改为=“”。 我试过为previousLine单独设置ifs并进入循环。然后我试图单独做currentLine if和它也进入循环但是当声明如果我有,它不起作用,而且当ifs彼此在这样时:

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

2 个答案:

答案 0 :(得分:1)

如果我理解这一点,你想要删除G00 Z多行的行?正如现在所写的那样,每次你找到一个骗局时,你都会删除你的“上一行”,所以你最终会在“欺骗”和“不是愚蠢”之间跳跃,即使它们都应该是愚蠢的。

你可能想要:

$currentLine = $_;
if ($previousLine =~ /G00 Z/ && $currentLine =~ /G00 Z/) {
   print MYFILE "";
} else {
   print MYFILE $currentLine;
}
$previousLine = $currentLine;

换句话说,将打印语句移到if()内,并根据需要输出空白行/当前行。

这样你在做“Dupes”时打印出空行,并且仍然保持REAL“previous”行,而不是用假空行覆盖它。

答案 1 :(得分:0)

我只是跳过印刷品:

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;