8

考虑:

string1 = "AAABBBBBCCCCCDDDDD"
string2 = "AEABBBBBCCECCDDDDD"

输出。不匹配的地方(在本例中为 E)将被 E 周围的 HTML 标记替换为它的颜色。

A**E**ABBBBBCC**E**CCDDDDD

到目前为止我尝试过的:XOR、diff 和 substr。首先,我需要找到索引,然后用模式替换这些索引。

4

6 回答 6

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

my $result = join '',
             map { $x[$_] eq $y[$_] ? $y[$_] : "**$y[$_]**" }
             0 .. $#y;
于 2013-05-22T02:13:35.200 回答
7

利用:

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;

它打印A**E**ABBBBBCC**E**CCDDDDD并经过了一些测试,但它可能包含错误。

于 2013-05-22T00:04:09.670 回答
4
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";

输出

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

一个更简单的,只打印出第二个字符串:

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];
}

输出

</b>A<b>E</b>ABBBBBCC<b>E</b>CCDDDDD
于 2013-05-22T00:14:21.613 回答
3

对于大字符串,这可能会占用大量内存:

use strict;
use warnings;

my $a = "aabbcc";
my $b = "aabdcc";

my @a = split //, $a;
my @b = split //, $b;

my $new_b = '';

for(my $i = 0; $i < scalar(@a); $i++) {
    $new_b .= $a[$i] eq $b[$i] ? $b[$i] : "**$b[$i]**";
}

输出

$ test.pl
new_b: aab**d**cc
于 2013-05-22T00:14:59.113 回答
2

有几种方法可以做到这一点。以下是解决此问题的可能方法。

my $str1="ABCDEA";
my $str2="AECDEB";
my @old1=split("",$str1);
my @old2=split("",$str2);

my @new;

for my $i (0..$#old1) {
        if ($old1[$i] eq $old2[$i] ) {
                push (@new, $old2[$i]);
        }
        else
        {
                my $elem = "**".$old2[$i]."**";
                push (@new , $elem);
        }
}
print @new;

输出是:

A**E**CDE**B**
于 2013-05-22T00:13:19.667 回答
2

对齐列并使用按位字符串运算符“^”:

my $a = "aabbccP";
my $b = "aabdccEE";
$_ = $a ^ $b;
s/./ord $& ? "^" : " "/ge;
print "$_\n" for $a, $b, $_;

给出:

aabbccP
aabdccEE
   ^  ^^
于 2015-05-23T01:18:53.227 回答