2013-08-04 14 views
6

私は、ファイルを1行ずつ読み込み、各行の特定の部分文字列を前に読み込んだ行と比較し、違う場合は新しいファイルに書き込みます。実際には、スクリプトはファイルの連続した行の中で一意でない行を削除します。論理の予期しないエラー

出力ファイルで一意の行を取得するのではなく、終端の行を取得するため、スクリプトで論理エラーが発生しているようです。

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

if (&IsSame($lastrd, $line))を変更しました。私が見ることができる大きなエラー(より多くの可能性があります)は、数値演算子( '!=')を使った比較です。 'Perl'は' ne'を使います。 – Birei

+0

オペレータを修正しました。残念ながら、エラーは残ります。 – Droidzone

+3

'if($ old ==" ")'も数値比較で、空文字列( '" "')もfalseであるため、単純に 'if($ old)'と言うことができます。 – marderh

答えて

5

[OK]を、私はそれをやった:

#!/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. 

これは==のバグを見つけるのに役立つかもしれません。

はまた、私はすべての行が異なっているunless (IsSame($lastrd, $line))

+0

文字列を比較するために '=='と '!='を使い、成功のために 'return 0'のどちらかが' perl'の逆であるため、OPは多くのシェルプログラミングをしていると思います。 – Birei

関連する問題