masatoの日記

やっていきます

Perlの組み込みモジュールText::Diffで差分をとってみる

シンプルなDiffツールのひとつとして

職場ではWindowsを使っていて、普段DiffをとるときはGUIなAraxis Mergeを使っています。1文字単位で差分を色分けして表示してくれるので、わかりやすく便利です。 とはいえ有料ソフトなので、だれでもが使えるわけではないのです。

かんたんに差分を確認したいだけであれば、色分け表示とかなくても大丈夫でしょう。

そんなとき、Perlクックブック Vol.1をぱらぱら見ていたら、ずばりText::Diffというモジュールが見つかりました。

このモジュールの使い方と出力のサンプルをのせてみます。

コード

file1

吾輩わがはいは猫である。名前はまだ無い。
 どこで生れたかとんと見当けんとうがつかぬ。
何でも薄暗いじめじめした所でミャオミャオないていた事だけは記憶している。

file2

吾輩わがはいは猫である。名前はまだ無い。
 どこで生れたかとんと見当けんとうがつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

鳴き声を変えてみました。

スクリプト

use Text::Diff;

#比較するファイル2つを指定
my $file1 = 'f1.txt';
my $file2 = 'f2.txt';

#引数にファイルを渡すだけ
my $diff = diff($file1, $file2);
print $diff;

簡単です。

結果は↓

--- f1.txt      Thu May  4 15:57:19 2017
+++ f2.txt      Thu May  4 15:57:26 2017
@@ -1,3 +1,3 @@
 吾輩わがはいは猫である。名前はまだ無い。
  どこで生れたかとんと見当けんとうがつかぬ。
-何でも薄暗いじめじめした所でミャオミャオないていた事だけは記憶している。
\ No newline at end of file
+何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
\ No newline at end of file

なんかよくわからない\ No newline at end of fileというメッセージが出てきてしまっていますが。

感想

1行ずつ比較されるようです。画面上で行の途中で折り返しされるほど1行の文字数が多い場合、どこが差分なのか探すのが大変な感じがします。

そのため、Text::Diffで差分をみるまえに、センテンス毎に改行を入れてやった方がみやすくなりそうです。つまり日本語であれば読点、英文であればピリオドで改行を入れてやる、と。

差分のみを出力する方法があれば、もっと便利だなと思います。

環境

Perl v5.18.2