#!/usr/bin/perl -l # http://perlmonks.org/?node_id=1178025 use strict; use warnings; use Algorithm::Diff qw(traverse_sequences); while() { my ($want, $in) = split; my @from = split //, $in; my @to = split //, $want; my $answer = ''; traverse_sequences( \@from, \@to, { MATCH => sub {$answer .= $from[shift()]}, DISCARD_A => sub {$answer .= "-$from[shift()]"}, DISCARD_B => sub {$answer .= "+$to[pop()]"}, } ); $answer =~ s/^(?:[+-]\w)+ | (?:[+-]\w)+$//gx; # strip outer $answer =~ tr/+-//d; # clean up inner $answer ||= 'not found'; print "$want in $in is $answer"; } __DATA__ ABC DFGABCKBG ABC DFGAXBHCY ABC DFGAXBHY ABC DEFGHI