Ich versuche ein Perl-Skript zu schreiben, das eine Datei Zeile für Zeile liest, einen bestimmten Teilstring jeder Zeile mit dem der zuvor gelesenen Zeile vergleicht, und wenn es anders ist, schreibt es in eine neue Datei . In der Tat entfernt das Skript nicht eindeutige Zeilen zwischen aufeinanderfolgenden Zeilen einer Datei.Unerwarteter Fehler der Logik
Das Skript scheint unter einem logischen Fehler zu leiden, da ich statt der eindeutigen Zeilen in der Ausgabedatei nur die Endzeile erhalte.
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;
}
}
Die Datei 'Ziel' nach der Ausführung, enthält die einzelne Zeile Done
.
Meine Quelldatei sieht wie folgt aus:
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
Alle Linien unterschiedlich sind. Ein großer Fehler, den ich sehen kann (es könnte mehr geben), ist der Vergleich mit dem numerischen Operator ('! ='). 'Perl' verwendet' ne' dafür. – Birei
Ich korrigierte den Operator. Leider bleibt der Fehler bestehen. – Droidzone
'if ($ old ==" ")' ist auch ein numerischer Vergleich und da ein leerer String ('" "') auch false ist, könntest du einfach sagen 'if ($ old)' – marderh