in reply to If there a way to find the location of the first difference between two strings?

Note that if the strings being compared are equal, both JavaFan and jwkrahn's solutions yield a number for the first difference offset that is equal to the length of the string(s).

>perl -wMstrict -lE "my $s1 = 'abcdefg'; my $s2 = 'abcdefg'; ;; my $t = $s1 ^ $s2; ;; my ($f) = $t =~ /^(\x{00}*)/; say length $f; ;; $t =~ /^\0*/ && say $+[0]; " 7 7
  • Comment on Re: If there a way to find the location of the first difference between two strings?
  • Download Code

Replies are listed 'Best First'.
Re^2: If there a way to find the location of the first difference between two strings?
by flexvault (Monsignor) on Mar 26, 2012 at 18:00 UTC

    I still needed to know how they compare (lt eq gt), so I did the following:

    srand( 711 ); . . . sub case2 { my $s1 = 'a' x 39 . 'b'; my $s2 = 'a' x 39 . chr( 98 + rand(4)); my ( $cmp, $loc ) = Cmp_and_Loc ( $s1, $s2 ); } sub Cmp_and_Loc { my ( $s1, $s2, undef ) = @_; my $t = 0; my $cmp = $s1 cmp $s2; if ( $cmp ) { $t = $s1 ^ $s2; $t =~ /^\0*)/; $t = $+[0]; } return ( $cmp, $t ); }

    This appeared to work since if the strings are equal the sub returns 0,0. I will test your variation, but it still flies compared to anything I tried. Using the rand(4), I think I was able to test all combinations.

    As always, when someone shows you how to do it correctly, it becomes easy :-)

    Thank you

    "Well done is better than well said." - Benjamin Franklin

Re^2: If there a way to find the location of the first difference between two strings?
by trizen (Hermit) on Mar 26, 2012 at 17:50 UTC
    Small fix:
    $t =~ /[^\0]/ && say $-[0];