Here's another version that uses
String::DiffLine. It's about 3 times faster than my previous post, according to Benchmark.
sub comp2
{
return undef if (length($_[0]) != length($_[1]));
my $i = diffline($_[0],$_[1]);
if ( ($i < length($_[0])) &&
(substr($_[0],$i+1,1) eq substr($_[1],$i,1)) &&
(substr($_[0],$i,1) eq substr($_[1],$i+1,1)) &&
(substr($_[0],$i+2) eq substr($_[1],$i+2)) )
{
return $i;
}
return undef;
}
String::DiffLine needs some tweaking to compile (change sv_undef to PL_sv_undef in the .xs file), but it seems to be quite fast.