$ perl -E ' $s1 = q{gctgc}; $s2 = q{gctcc}; $x = $s1 ^ $s2; say for map sprintf( q{0x%02x}, ord ), split m{}, $x;' 0x00 0x00 0x00 0x04 0x00 $ #### use strict; use warnings; use 5.014; open my $inFH, q{<}, \ <; chomp $baseStr; while ( <$inFH> ) { chomp; $baseStr = flagDiffs( $baseStr, $_ ); } close $inFH or die $!; say for split m{X+}, $baseStr; sub flagDiffs { my( $baseStr, $nextStr ) = @_; my $diff = $baseStr ^ $nextStr; my @posns; push @posns, pos $diff while $diff =~ m{(?=[^\0])}g; substr $baseStr, $_, 1, q{X} for @posns; return $baseStr; } #### at gctgctaggctgtgctgccaactggatcctgcgcgggacgtcctttgtctacgtcccgtcggcgctgaatcctgcggacgacccctctcgtggtcg ttggggctct ccgccctcttctccgcctgccgttc ggc #### use strict; use warnings; use 5.014; open my $inFH, q{<}, \ <; my %diffPosns; while ( <$inFH> ) { findDiffPosns( $baseStr, $_ ); } close $inFH or die $!; chomp $baseStr; substr $baseStr, $_, 1, q{X} for keys %diffPosns; say for split m{X+}, $baseStr; sub findDiffPosns { my( $baseStr, $nextStr ) = @_; my $diff = $baseStr ^ $nextStr; $diffPosns{ pos $diff } ++ while $diff =~ m{(?=[^\0])}g; }