here it is again in forward order, with deletions and
additions processed in a single pass:
#!/usr/bin/perl -w
use Data::Dumper;
use Algorithm::Diff qw(diff);
use strict;
use subs qw(patch);
##
##
sub patch
{
my @orig = @{shift()};
my $diff = shift;
my $shift = 0;
for my $hunk (@$diff)
{
for my $change (@$hunk)
{
if ($change->[0] eq "-")
{
# process deletions
splice @orig, $change->[1] + $shift, 1;
--$shift;
}
elsif ($change->[0] eq "+")
{
# process additions
splice @orig, $change->[1], 0, $change->[2];
++$shift;
}
}
}
@orig;
}
##
##
my @orig = qw(a b c e h j l m n p);
my @rev = qw(b c d e f j k l m r s t);
my $diff = diff \@orig, \@rev;
my @patched = patch \@orig, $diff;
print "Original:\t@orig", $/;
print "Revision:\t@rev", $/;
print "Patched:\t@patched", $/;