2013-08-04 17 views
6

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 
+2

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

+0

Ich korrigierte den Operator. Leider bleibt der Fehler bestehen. – Droidzone

+3

'if ($ old ==" ")' ist auch ein numerischer Vergleich und da ein leerer String ('" "') auch false ist, könntest du einfach sagen 'if ($ old)' – marderh

Antwort

5

ok, ich habe es:

#!/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; 
    } 
} 

druckt:

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 

Wenn Sie Warnungen in Ihrem Code aktiviert ist, könnten Sie siehe nützliche Informationen:

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. 

Welches könnte Ihnen helfen, == Bug zu finden.

Auch änderte ich if (&IsSame($lastrd, $line)) zu unless (IsSame($lastrd, $line))

+0

Ich denke, das OP macht viel Shell-Programmierung, weil entweder '==' und '! =' Zum Vergleichen von Strings und 'return 0' zum Erfolg sind umgekehrt in' perl'. – Birei

Verwandte Themen