in reply to Compare two strings of same length, character-by-character
use Algorithm::Diff qw(traverse_sequences); #--------------------------------------------------------------------- +------------- # C O M P A R A T O R #--------------------------------------------------------------------- +------------- sub comparator { my $str1 = shift @_; my $str2 = shift @_; my $original = ''; my $revised = ''; my @from = split(/([ ,.:;"?!-])/, $str1); my @to = split(/([ ,.:;"?!-])/, $str2); my $OS = q|<span class="m">|; my $OE = q|</span>|; my $RS = q|<span class="m">|; my $RE = q|</span>|; traverse_sequences( \@from, \@to, { MATCH => sub { my $oldtext = $from[shift()]; if ($oldtext =~ /<P>/) { $original .= "</p>\n<p>"; $revised .= "</p>\n<p>" } else { $original .= "$oldtext"; $revised .= "$oldtext" } }, DISCARD_A => sub { my $oldtext = $from[shift()]; if ($oldtext =~ /<P>/) { $original .= "</p>\n<p>" } elsif ($original =~ m!</span>\s$!) { if ($oldtext =~ m/(?:[,.:;"?!-])/) { $original =~ s/(?:<\/span>)*\s+$/$oldtext$OE/; + } else { $original =~ s/<\/span>\s$/ $oldtext$OE/; } } else { $original .= $OS.$oldtext.$OE } }, DISCARD_B => sub { my $newtext = $to[pop()]; if ($newtext =~ /<P>/) { $revised .= "</p>\n<p>" } elsif ($revised =~ m!</span>\s$!) { if ($newtext =~ m/(?:[,.:;"?!-])/) { $revised =~ s/(?:<\/span>)*\s+$/$newtext$RE/; } else { $revised =~ s/<\/span>\s$/ $newtext$RE/; } } else { $revised .= $RS.$newtext.$RE } }, } ); $original =~ s~^(</p>)(.*+)$~$2$1~; $revised =~ s~^(</p>)(.*+)$~$2$1~; return ($original, $revised); } #END SUB comparator
Blessings,
~Polyglot~
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: Compare two strings of same length, character-by-character
by tybalt89 (Monsignor) on Nov 29, 2023 at 21:25 UTC | |
Re^2: Compare two strings of same length, character-by-character
by Polyglot (Chaplain) on Nov 29, 2023 at 10:06 UTC | |
by karlgoethebier (Abbot) on Nov 29, 2023 at 11:35 UTC |