use strict;
use warnings;
use Algorithm::Diff qw( LCSidx );
use Data::Dumper qw( Dumper );
sub parse_data { map [ (split)[1,2] ], split /^/m, $_[0] }
my @old = parse_data(<<'__EOI__');
1 b Uniq
2 f Uniq
3 c Uniq
4 a Uniq
5 e Uniq
6 c Uniq
7 a Uniq
8 b Uniq
9 d Burn
10 d Burn
11 e Burn
12 a Burn
13 f Burn
14 b Burn
__EOI__
my @new = parse_data(<<'__EOI__');
1 e Uniq
2 a Uniq
3 f Uniq
4 c Uniq
5 a Uniq
6 a Uniq
7 b Uniq
8 e Uniq
9 c Uniq
10 f Uniq
11 a Uniq
12 b Uniq
13 d Burn
14 d Burn
15 b Burn
16 d Burn
17 c Burn
18 c Burn
19 b Burn
20 d Burn
21 e Burn
22 a Burn
23 f Burn
24 b Burn
__EOI__
sub write_compactly {
my ($keep, $del, $ins, @inserted) = @_;
$_ ||= '' for $keep, $del, $ins;
local $Data::Dumper::Useqq = 1;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Indent = 0;
my $inserted = Dumper(\@inserted);
$inserted = substr($inserted, 1, -1);
print("$keep,$del,$inserted\n");
}
sub keygen {
return join ',', @{ $_[0] };
}
my ($oil, $nil) = LCSidx(\@old, \@new, \&keygen);
push @$oil, 0+@old;
push @$nil, 0+@new;
my ($oi, $ni) = (0, 0);
do {
my $s = @$oil;
while (@$oil > 1
&& $oi == $oil->[0]
&& $ni == $nil->[0]
) {
shift @$oil; ++$oi;
shift @$nil; ++$ni;
}
my $keep = $s - @$oil;
$oi += my $del = $oil->[0] - $oi;
$ni += my $ins = $nil->[0] - $ni;
write_compactly($keep, $del, $ins, @new[ $ni-$ins .. $ni-1 ])
} while @$oil > 1;
,1,["e","Uniq"],["a","Uniq"]
3,,["a","Uniq"],["b","Uniq"]
2,,["f","Uniq"]
3,,["d","Burn"],["b","Burn"],["d","Burn"],["c","Burn"],["c","Burn"],["
+b","Burn"]
5,,
Feel free to adjust write_compactly.
|