http://www.perlmonks.org?node_id=840583

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello fellow Monks!
I have 2 strings, namely:
$first= "AAAAXXXXAAAAXXXXXXXXXXXAAAA"; $second="AXXXAXXAAXXXXXAAAAXXXXXAAAA";

I want to know how many letters do they share in common. The "traditional" way that I'm thinking of is:
1) Split $first, split $second
2) Foreach letter in @split_first array, see if, in the same position in the array @split_second you have the same letter
3)Count the times you get success
Is there something quicker than that?
I just need the number of positions in the arrays (they always have the same number of letters), that the have the same letter.
Thanks!

Replies are listed 'Best First'.
Re: Quicker way to compare these 2 strings?
by TimToady (Parson) on May 19, 2010 at 00:57 UTC
    $matches = ($first ^ $second) =~ tr/\0//;
Re: Quicker way to compare these 2 strings?
by cormanaz (Deacon) on May 19, 2010 at 00:14 UTC
    You could do the same thing with substr without creating the arrays:
    my $matches; for my $i (0..length($first) { if (substr($first,$i,0) eq substr($second,$i,0)) { $matches++; } }
    I don't know if it would be faster, but it's possible since you wouldn't have the overhead associated with splitting the strings into the arrays. Maybe some interpreter monk knows the answer to that.
      I don't know if it would be faster, ... Maybe some interpreter monk knows the answer to that.
      No need to have intimate knowledge of the interpreter when the OP can just Benchmark the split solution versus your fine substr solution, using representative strings.
      Ok, with some minor corrections it works just fine!
      Thanks!
      $first= "AAAAXXXXAAAAXXXXXXXXXXXAAAA"; $second="AXXXAXXAAXXXXXAAAAXXXXXAAAA"; $matches=0; for $i (0..length($first)-1) { if (substr($first,$i,1) eq substr($second,$i,1)) { $matches++; } } print $matches."\n";