2008-02 / 2008-02-28

前のエントリ: Text::CHMでHTMLヘルプファイル(.chm)を展開する [perl]
次のエントリ: そろそろ本気出す [diary]

Text::Diff で差分抽出
2008-02-28-1 / カテゴリ: [programming][perl] / [permlink]

ファイル単位の比較なら/usr/bin/diffで済むけど、比較前にフィルタ通してごにょごにょした結果を比較したりして追加行・削除行・変更行を一覧にしてサクっと出したい、とか

diff -u fileA fileB と同じ動作
use Text::Diff;

print diff "fileA", "fileB";
デフォルトはUnified形式。Context/OldStyleは指定すれば良い
print diff "fileA", "fileB", { STYLE => "Context" };

バッファの比較。
例えば、cのソースファイルをopen、コメントを削除した上で比較、など
my $data1 = なんかデータその1;
my $data2 = なんかデータその2;

my $diff = diff \$data1, \$data2;
リファレンスを渡す。戻り値はUnified形式の文字列がごそっと返ってくる。

差異行前後の表示する行数の指定(10行:diff -u10 file1 file2)
diff \$data1, \$data2, { CONTEXT => 10 };

出力先にファイルハンドルを直接指定する
open W, "> out"
  or die;
my $count = diff \$data1, \$data2, { OUTPUT => \*W };
close W;
差分情報がそのままファイルハンドルに出力される。
diff()は差異の件数を返す。
行数ではなく件数。平たく言えば、行頭が-/+の行数でなく、@の行数

行数を数えたい場合は、OUTPUT は指定せずに戻り値の文字列をカウントする…しかないのかな? よくわからんorz

とりあえず、数えるだけならこんな感じかな。
my $cnt = () = ($diff =~ /^[-+]\s/mg);
前のエントリ: Text::CHMでHTMLヘルプファイル(.chm)を展開する [perl]
次のエントリ: そろそろ本気出す [diary]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12