私は、ファイルを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
に
if (&IsSame($lastrd, $line))
を変更しました。私が見ることができる大きなエラー(より多くの可能性があります)は、数値演算子( '!=')を使った比較です。 'Perl'は' ne'を使います。 – Bireiオペレータを修正しました。残念ながら、エラーは残ります。 – Droidzone
'if($ old ==" ")'も数値比較で、空文字列( '" "')もfalseであるため、単純に 'if($ old)'と言うことができます。 – marderh