2017-03-06 17 views
0

背景:私はPerlでの経験がなく、今日だけ始めました。私は2つのファイルを行ごとに比較しようとしています。別の文書に記載されていた。私は一度に1ステップずつ機能を追加しているので、まだそれを得ることはまだありません。ファイル::比較の比較は常に-1を返します

エラー:2つのファイルハンドルの比較を行っていますが、File :: Compareの説明に従って、エラーである-1が発生しています。しかし、どこにエラーが発生しているのか分かりません。

コード:

use strict; 
use warnings; 
use File::Compare; 

my $filename1 = 'test1.txt'; 
my $filename2 = 'test2.txt'; 
open(my $fh, '<:encoding(UTF-8)', $filename1) 
    or die "Could not open file '$filename1' $!"; 
open(my $fr, '<:encoding(UTF-8)', $filename2) 
    or die "Could not open file '$filename2' $!"; 

while() { 
    my $row1 = <$fh>; 
    my $row2 = <$fr>; 
    my $row1Num; 
    my $row2Num; 
    if ($row1 && $row2) { 
    chomp $row1; 
    chomp $row2; 
    $row1Num = substr($row1, 0, index($row1, ',')); 
    $row2Num = substr($row2, 0, index($row2, ',')); 
    while ($row1Num != $row2Num) { 
     if (!$row1 || !$row2) { 
     last; 
     } 
     if ($row1Num < $row2Num) { 
     #! Add row1Num to the list 
     print "$row1\n"; 
     $row1 = <$fh>; 
     if (!$row1) { 
      last; 
     } 
     chomp $row1; 
     $row1Num = substr($row1, 0, index($row1Num, ',')); 
     } else { 
     #! Add row2Num to the list 
     print "$row2\n"; 
     $row2 = <$fr>; 
     if (!$row2){ 
      last; 
     } 
     chomp $row2; 
     $row2Num = substr($row2, 0, index($row2Num, ',')); 
     } 
    } 
    } 
    if ($row1 && $row2) 
    { 
    if (compare($row1,$row2) != 0) 
    { 
     #! Add row1Num to the list 
     my $compare = compare($row1,$row2); 
     my $compare2 = compare($row2,$row1); 
     print "Compare($row1,$row2) == $compare\n"; 
     print "Compare($row2,$row1) == $compare2\n"; 
    } 
    } elsif (!$row1 && $row2) { 
    #! Add row2Num to the list 
    chomp $row2; 
    print "$row2\n"; 
    } elsif ($row1 && !$row2) { 
    #! Add row1Num to the list 
    chomp $row1; 
    print "$row1\n"; 
    } else { 
    last; 
    } 
} 
print "done\n"; 

出力:

Compare(1,a,1,1) == -1 
Compare(1,1,1,a) == -1 
Compare(2,b,2,2) == -1 
Compare(2,2,2,b) == -1 
Compare(3,3,3,3) == -1 
Compare(3,3,3,3) == -1 
4,d 
5,5 
done 

test1.txtという:

1,a 
2,b 
3,3 
4,d 

test2.txtという名前:

1,1 
2,2 
3,3 
5,5 

誰かが私が馬鹿になっている場所に気づくことができれば、とても感謝しています。

+0

てみタイピング:あなたのサンプルデータから出力される

キャッシュは必要ありませんが、あなたがソートするアイテムが大量にある場合に便利です)

#!/usr/bin/perl use strict; use warnings; my %count; $count{$_}++ while <>; print sort by_row_num grep $count{$_} == 1, keys %count; my %cache; sub by_row_num { ($cache{$a} //= substr($a, 0, index($a, ','))) <=> ($cache{$b} //= substr($b, 0, index($b, ','))) } 
をソートしますあなたのコマンドラインで 'perldoc -q intersection'を実行して、それをどうやって得るかについてのいくつかのアイデアを得てください。 –

+0

File :: Compareの 'compare'は、引数として比較するファイルの名前を期待しています。単純に 'eq'演算子が必要なようです。 – ikegami

答えて

0

ikegamiは、File::Compareに関するあなたのコードのエラーを指摘しました。ここに、ハッシュを使用する可能な解決策、%countがあります。

いずれかのファイルの行が何回見つかったかを記録します。 count == 1の場合、その行は両方のファイルで一度しか見られませんでした - 私はそれがあなたが望む結果だと思います。

明示的に各ファイルを開く代わりに、コマンドラインでファイル名を指定しました。これにより、while <>の構文で両方のファイルを読み取ることができます。また、私は違いの大規模な、(1000 +)、番号がある場合は、プログラムの速度が向上しますソートサブルーチンのキャッシュを使用することに注意してください(

perl program_name.pl test1.txt test2.txt

:コマンドラインは次のようになります

1,a 
1,1 
2,2 
2,b 
4,d 
5,5