gpt4 book ai didi

perl - 意外的逻辑错误

转载 作者:行者123 更新时间:2023-12-02 02:04:02 24 4
gpt4 key购买 nike

我正在尝试编写一个 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;
}
}

执行后的文件“目标”包含单行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

最佳答案

好的,我做到了:

#!/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 ( &IsSame($lastrd, $line)) 更改为 unless ( IsSame($lastrd, $line))

关于perl - 意外的逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18041838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com