Perl で2つのテキストファイルの差分をみるには

UNIX のコマンドでテキストファイルの差分箇所を抽出するには diff が便利です。 そしてこれはもちろん Perl でも行うことができます。 以下に3通りのdiffに対応したPerlコードを示します。

 

一致しているかどうかだけ分かればよい場合

  • Digest::MD5 もしくは
  • Digest::SHA1

を使います。

 例:

diff_digest_hd5.pl

 

実行結果:
$ cat A
Boys
Hello,
and Boys

$ cat B
Boys
Hello,
and Girls

$ perl digest_hd5.pl --f1 A --f2 B
Files do not match.

 

差分も含め抽出したいとき

Text::Diff を使います。 このモジュールは Algorithm::Diff を利用して作成されています。

例:

text_diff.pl

 

実行結果:
$ perl text_diff.pl --f1 A --f2 B
*** DIFF ***
*** A Tue Oct 7 12:46:37 2014
--- B Tue Oct 7 12:46:37 2014
***************
*** 1,4 ****
 Boys
 Hello,
! and Boys

--- 1,4 ----
 Boys
 Hello,
! and Girls

 

改行単位で順不同でファイル間に差分があるかを表示したいとき

Tie::File を使ってファイルを配列にすることでこの差分を見ることができます。

 

例:

text_diff_with_tie.pl

 

実行結果:
# A, B は改行単位で順不同ではファイル間に差分はない

$ cat A
Boys
Hello,
and Boys

$ cat B
Boys
Hello,
and Boys

$ perl text_diff.pl --f1 A --f2 B
Files match!!!

 

参考