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