Algorithm-Diff-1.15 > Algorithm::DiffOld

名前

Algorithm::DiffOld - 2つのファイル/リスト間での'気の利いた'差異を求めます。 ただし古い(<=0.59)インターフェースを使います。

注意

これはNed KonzによるAlgorithm::Diffの一部として提供されます。 このモジュールは、キー生成関数ではなく、比較関数を使っている 古いインターフェースを持ったなければならない人たちだけの ものです。

1つの配列の各行はもう一つの配列の各行で比較されなければならないので、 これはM*Nの比較を行います。これは非常に遅くなりかねません。 私が計ったところ、4000行のファイルでAlgorithm::Diffの標準バージョンと 比較したところ18倍もかかってしまいました。これは配列の大きさの2乗で 悪化するでしょう。

概要

  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 );

比較関数

メイン・ルーチンのそれぞれには、比較関数が渡されます。もし渡さないので あれば代わりに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 でのキー生成関数では、これをおこなう方法がありません。