you have an error at:
my @new = split //, $new;
my $longer = (@cold > @new) ? $#cold : $#new;
Which should be:
my @cnew = split //, $new;
my $longer = (@cold > @cnew) ? $#cold : $#cnew;
And at:
substr ($old, subscr, 0) = $span;
substr ($new, subscr, 0) = $span;
Which should be:
substr ($old, $subscr, 0) = $span;
substr ($new, $subscr, 0) = $span;
Also this:
my $losubscr; #two subscripts because differ len of new and old
my $lnsubscr;
@cold = reverse @cold;
@cnew = reverse @cnew; #we're gonna search these backwards
for (0..$longer) {
if ($cold[$_] ne $cnew[$_]) {
$losubscr = @cold - $_;
$lnsubscr = @cnew - $_;
last;
}
}
#got pertinent subscripts, now insert span tags
substr ($old, $losubscr, 0) = $espan;
substr ($new, $lnsubscr, 0) = $espan;
substr ($old, subscr, 0) = $span;
substr ($new, subscr, 0) = $span;
Could be shortened to:
my $lsubscr;
@cold = reverse @cold;
@cnew = reverse @cnew; #we're gonna search these backwards
for (0..$longer) {
if ($cold[$_] ne $cnew[$_]) {
$lsubscr = -$_;
last;
}
}
#got pertinent subscripts, now insert span tags
substr $old, $lsubscr, 0, $espan;
substr $new, $lsubscr, 0, $espan;
substr $old, $subscr, 0, $span;
substr $new, $subscr, 0, $span;
Another way to write that would be:
while ( defined( my $first = <DATA> ) && defined( my $second = <DATA>
+) ) {
print spandiffstr( $first, $second );
}
sub spandiffstr {
my ( $old, $new ) = @_;
my $span = '<span>';
my $espan = '</span>';
( $old ^ $new ) =~ /^\0*/ and my $subscr = $+[0];
my ( $rold, $rnew ) = map scalar reverse, $old, $new;
( $rold ^ $rnew ) =~ /^\0*/ and my $lsubscr = -$+[0];
# got pertinent subscripts, now insert span tags
substr $old, $lsubscr, 0, $espan;
substr $new, $lsubscr, 0, $espan;
substr $old, $subscr, 0, $span;
substr $new, $subscr, 0, $span;
return $old, $new;
}