2013-08-04 46 views
6

Tôi đang cố gắng viết một tập lệnh perl sẽ đọc một dòng tệp, so sánh chuỗi con cụ thể của từng dòng với dòng của dòng đã đọc trước đó và nếu khác, hãy ghi nó vào tệp mới . Trong thực tế, kịch bản loại bỏ các dòng không duy nhất giữa các dòng tuần tự của một tệp.Lỗi không mong muốn của logic

Các kịch bản dường như bị mắc một lỗi logic, như thay vì nhận được dòng duy nhất trong tập tin đầu ra, tôi chỉ nhận được dòng chấm dứt.

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; 
    } 
} 

Tệp 'đích' sau khi thực thi, chứa một dòng Done.

tập tin nguồn của tôi trông như thế này:

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

Tất cả các dòng khác nhau. Một lỗi lớn tôi có thể thấy (có thể có nhiều hơn) là so sánh bằng toán tử số ('! ='). 'Perl' sử dụng' ne' cho nó. – Birei

+0

Tôi đã sửa chữa toán tử. Thật không may là lỗi vẫn còn. – Droidzone

+3

'if ($ old ==" ")' cũng là một so sánh số và như một chuỗi rỗng ('" "') là sai quá bạn chỉ có thể nói 'if ($ cũ)' – marderh

Trả lời

5

ok, tôi đã làm điều đó:

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

in:

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 

Nếu bạn kích hoạt cảnh báo trong mã của bạn, bạn có thể xem thông tin hữu ích:

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. 

Điều này có thể giúp bạn tìm lỗi ==.

Ngoài ra tôi đã thay đổi if (&IsSame($lastrd, $line)) thành unless (IsSame($lastrd, $line))

+0

Tôi đoán OP có nhiều chương trình shell, bởi vì hoặc sử dụng '==' và '! =' Để so sánh các chuỗi và 'return 0' cho thành công là ngược lại trong' perl'. – Birei

Các vấn đề liên quan