Как я могу сравнить два файла и показать различия в Perl? - PullRequest
1 голос
/ 18 ноября 2011

Я пытаюсь написать Perl-скрипт для сравнения содержимого двух файлов, чтобы в нем были перечислены все различия.Пробую следующее, но я не уверен, как продолжить дальше.Обратите внимание, что следующее - только часть сценария, так как я предварительно отсортировал содержимое двух файлов.Заранее спасибо.

open (FILE1, "log") || die ("Can't open file log for reading") ;
open (FILE2, "master") || die ("Can't open file master for reading") ;

@file1 = <FILE1> ;
@file2 = <FILE2> ;

#$perlcompare = (compare('log','master')== 0) ;
#die ("Log and master files are equal and match.\n") ;

if (@file1 eq @file2) {

print "Log and master are equal and match.\n" ;
} else  ????????????

exit 0;

Ответы [ 3 ]

5 голосов
/ 18 ноября 2011

Если вам нужно остаться в Perl, есть File :: Compare , который просто сравнит файлы.

Для отображения различий есть Text :: Diff .

C:\Temp> cat file1
1
2
3
4
5
C:\Temp> cat file2
1
2
3
5
#!/usr/bin/env perl

use strict; use warnings;

use Text::Diff;

my $diffs = diff 'file1' => 'file2';

print $diffs;

Выход

C:\Temp> t
--- file1       Fri Nov 18 00:01:40 2011
+++ file2       Fri Nov 18 00:01:49 2011
@@ -1,5 +1,4 @@
 1
 2
 3
-4
+5
-5
2 голосов
/ 18 ноября 2011

Если вы можете использовать что-то еще, кроме perl, я бы порекомендовал diff (1) или comm (1)

comm -3 sorted-file-1 sorted-file-2
1 голос
/ 20 июня 2014
#!/usr/bin/perl
use strict;
use warnings;
use List::Compare;

open (my $log, "<", "log") or die $!;
open (my $master, "<", "master") or die $!;
my @content_log=<$log>;
my @content_master=<$master>;

my $lc = List::Compare->new(\@content_log, \@content_master);    
my @intersection = $lc->get_intersection;
my @firstonly = $lc->get_unique;
my @secondonly = $lc->get_complement;

print "Common Items:\n"."@intersection"."\n";
print "Items Only in First List:\n"."@firstonly"."\n";
print "Items Only in Second List:\n"."@secondonly"."\n";

print "log\n", $lc->get_unique,"\n"; 
print "master\n", $lc->get_complement,"\n"; 

close $log;
close $master;
...