【问题标题】:Unexpected error of logic逻辑意外错误
【发布时间】:2013-08-05 04:43:02
【问题描述】:

我正在尝试编写一个 perl 脚本,它将逐行读取文件,将每行的特定子字符串与先前读取的行的子字符串进行比较,如果不同,则将其写入新文件。实际上,脚本会删除文件连续行中的非唯一行。

脚本似乎遇到了逻辑错误,因为我没有在输出文件中获得唯一的行,而是获得了终止行。

use strict;
my $src='/var/www/pinginfo/ugvps';
my $tar="target";
open(INP, $src) or die("Could not open: $!.");
open(OUTP, ">", $tar) or die "Couldn't open: $!";
my $lastrd="";
while( my $line = <INP> ) {
    if ( &IsSame($lastrd, $line)) {
        print "Unique line: ".$line."\n";
        print OUTP $line;
        $lastrd=$line;
    } else {
        print "Line was the same: ".$line."\n";
    }
}
print OUTP "Done";
close (OUTP);
close (INP);
exit 0;

sub IsSame {
    my $old=$_[0];
    my $new=$_[1];
    if ( $old == "" ) {
        return 0;
    }
    my @values_old = split('\|',$old);
    my @values_new = split('\|',$new);
    if ( $values_old[3] eq $values_new[3] ) {
        #True - they are the same
        return 1;
    } else {
        #False
        return 0;
    }
}

执行后的文件'target',包含单行Done

我的源文件如下所示:

UGVPS|6.6.6.6|03-08-2013 10:16:21 PM|0
UGVPS|6.6.6.6|03-08-2013 11:06:01 PM|0
UGVPS|6.6.6.6|03-08-2013 11:08:01 PM|100
UGVPS|6.6.6.6|03-08-2013 11:10:01 PM|0
UGVPS|6.6.6.6|03-08-2013 11:14:01 PM|100
UGVPS|6.6.6.6|03-08-2013 11:16:01 PM|0
UGVPS|6.6.6.6|03-08-2013 11:52:02 PM|0
UGVPS|6.6.6.6|03-08-2013 11:54:01 PM|100
UGVPS|6.6.6.6|03-08-2013 11:56:01 PM|100
UGVPS|6.6.6.6|03-08-2013 11:58:01 PM|100
UGVPS|6.6.6.6|04-08-2013 12:00:01 AM|0
UGVPS|6.6.6.6|04-08-2013 12:02:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:04:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:06:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:08:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:10:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:12:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:14:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:16:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:18:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:20:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:22:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:24:01 AM|0
UGVPS|6.6.6.6|04-08-2013 02:38:01 AM|0

【问题讨论】:

  • 所有行都不一样。我可以看到的一个大错误(可能还有更多)是使用数字运算符(!=)进行比较。 Perl 使用 ne
  • 我更正了运算符。不幸的是,错误仍然存​​在。
  • ` if ( $old == "" ) ` 也是一个数字比较,作为一个空字符串 ("") 也是错误的,你可以简单地说 if($old)
  • +1 这个问题非常明确。它显示完整的源代码,提供输入数据,允许回答者自己重现问题,并将对原因的推测与对症状的观察分开。

标签: perl file file-io logic


【解决方案1】:

好的,我做到了:

#!/usr/bin/perl

use strict;
use warnings;

my $src='./input.txt';
my $tar="./target.txt";
open(INP, $src) or die("Could not open: $!.");
open(OUTP, ">", $tar) or die "Couldn't open: $!";
my $lastrd="";
while( my $line = <INP> ) {
    unless ( IsSame($lastrd, $line)) {
        print "Unique line: ".$line."\n";
        print OUTP $line;
        $lastrd=$line;
    } else {
        print "Line was the same: ".$line."\n";
    }
}
print OUTP "Done";
close (OUTP);
close (INP);
exit 0;

sub IsSame {
    my $old=$_[0];
    my $new=$_[1];
    if ( $old eq "" ) {
        return 0;
    }
    my @values_old = split('\|',$old);
    my @values_new = split('\|',$new);
    if ( $values_old[3] eq $values_new[3] ) {
        #True - they are the same
        return 1;
    } else {
        #False
        return 0;
    }
}

打印:

UGVPS|6.6.6.6|03-08-2013 10:16:21 PM|0
UGVPS|6.6.6.6|03-08-2013 11:08:01 PM|100
UGVPS|6.6.6.6|03-08-2013 11:10:01 PM|0
UGVPS|6.6.6.6|03-08-2013 11:14:01 PM|100
UGVPS|6.6.6.6|03-08-2013 11:16:01 PM|0
UGVPS|6.6.6.6|03-08-2013 11:54:01 PM|100
UGVPS|6.6.6.6|04-08-2013 12:00:01 AM|0
UGVPS|6.6.6.6|04-08-2013 12:02:01 AM|100
UGVPS|6.6.6.6|04-08-2013 12:24:01 AM|0
Done

如果您在代码中启用警告,您会看到有用的信息:

Argument "" isn't numeric in numeric eq (==) at 7.pl line 28, <INP> line 2.
Argument "" isn't numeric in numeric eq (==) at 7.pl line 28, <INP> line 3.

这可以帮助您找到== 错误。

我也把if ( &amp;IsSame($lastrd, $line))改成了unless ( IsSame($lastrd, $line))

【讨论】:

  • 我猜 OP 做了很多 shell 编程,因为要么使用 ==!= 比较字符串,而 return 0 成功与 perl 相反。
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多