Compare two strings and highlight mismatch characters in Perl

my @x = split '', "AAABBBBBCCCCCDDDDD";
my @y = split '', "AEABBBBBCCECCDDDDD";

my $result = join '',
             map { $x[$_] eq $y[$_] ? $y[$_] : "**$y[$_]**" }
             0 .. $#y;

Use:

use strict;
use warnings;

my $string1 = 'AAABBBBBCCCCCDDDDD';
my $string2 = 'AEABBBBBCCECCDDDDD';
my $result = '';
for(0 .. length($string1)) {
    my $char = substr($string2, $_, 1);
    if($char ne substr($string1, $_, 1)) {
        $result .= "**$char**";
    } else {
        $result .= $char;
    }
}
print $result;

It prints A**E**ABBBBBCC**E**CCDDDDD and was tested somewhat, but it may contain errors.


use warnings;
use strict;
my ($s1, $s2, $o1, $o2) = ("AAABBBBBCCCCCDDDDD", "AEABBBBBCCECCDDDDD");
my @s1 = split(//, $s1);
my @s2 = split(//, $s2);
my $eq_state = 1;
while (@s1 and @s2) {
    if (($s1[0] eq $s2[0]) != $eq_state) {
        $o1 .= (!$eq_state) ? "</b>" : "<b>";
        $o2 .= (!$eq_state) ? "</b>" : "<b>";
    }
    $eq_state = $s1[0] eq $s2[0];
    $o1.=shift @s1;
    $o2.=shift @s2;
}
print "$o1\n$o2\n";

Output

A<b>A</b>ABBBBBCC<b>C</b>CCDDDDD
A<b>E</b>ABBBBBCC<b>E</b>CCDDDDD

A simpler one that only prints out the second string:

use warnings;
use strict;
my ($s1, $s2, $was_eq) = ("AAABBBBBCCCCCDDDDD", "AEABBBBBCCECCDDDDD", 1); 
my @s1 = split(//, $s1);
my @s2 = split(//, $s2);
for my $idx (0 .. @s2 -1) {
    my $is_eq = $s1[$idx] eq $s2[$idx];
    print $is_eq ? "</b>" : "<b>" if ( $was_eq != $is_eq);
    $was_eq = $is_eq;
    print $s2[$idx];
}

Outout

</b>A<b>E</b>ABBBBBCC<b>E</b>CCDDDDD

Tags:

Perl