=encoding euc-jp =head1 名前 Algorithm::DiffOld - 2つのファイル/リスト間での'気の利いた'差異を求めます。 ただし古い(<=0.59)インターフェースを使います。 =head1 注意 これはNed KonzによるAlgorithm::Diffの一部として提供されます。 このモジュールは、キー生成関数ではなく、比較関数を使っている 古いインターフェースを持ったなければB<ならない>人たちB<だけ>の ものです。 1つの配列の各行はもう一つの配列の各行で比較されなければならないので、 これはM*Nの比較を行います。これは非常に遅くなりかねません。 私が計ったところ、4000行のファイルでAlgorithm::Diffの標準バージョンと 比較したところ18倍もかかってしまいました。これは配列の大きさの2乗で 悪化するでしょう。 =head1 概要 use Algorithm::DiffOld qw(diff LCS traverse_sequences); @lcs = LCS( \@seq1, \@seq2, $comparison_function ); $lcsref = LCS( \@seq1, \@seq2, $comparison_function ); @diffs = diff( \@seq1, \@seq2, $comparison_function ); traverse_sequences( \@seq1, \@seq2, { MATCH => $callback, DISCARD_A => $callback, DISCARD_B => $callback, }, $comparison_function ); =head1 比較関数 メイン・ルーチンのそれぞれには、比較関数が渡されます。もし渡さないので あればB<代わりにAlgorithm::Diffを使ってください>。 これらの関数は、2つの要素が同じのときtrueを返さなければなりません。 例えば、 @lcs = LCS( \@seq1, \@seq2, sub { my ($a, $b) = @_; $a eq $b } ); しかし、あなたの比較関数がこれしかしないのであれば、単純にAlgorithm::Diff を使い、それにこうさせてください(これがそのデフォルトです)。 あるいは: sub someFunkyComparisonFunction { my ($a, $b) = @_; $a =~ m{$b}; } @diffs = diff( \@lines, \@patterns, \&someFunkyComparisonFunction ); これによりテキスト行が入った配列@linesと正規表現で構成されている 配列@patternsとの差異を取ることが出来ます。 実際には、これが私がこのバージョンを書いた理由です -- 標準のAlgorithm::Diff でのキー生成関数では、これをおこなう方法がありません。