On Tue, 2004-04-20 at 19:26, Bernie Cosell wrote:
> On 20 Apr 2004 at 19:57, [EMAIL PROTECTED] wrote:
> > We want to find out the first position $n at which strings $x and $y
> > differ.  If $x eq $y, then $n is undef.  If $x ne $y but $x is a
> > prefix (aka initial segment) of $y, then $n should be equal to length
> > $x.  The operation must preserve both $x and $y (i.e. destructive
> > operations are disallowed).
> 
> How about [not golfing so the code is clearer]:
>     my $diff = $x ^ $y;
>     my ($len) = $diff =~ /^([\0])[^\0]/ ;
>     return uhdef if not defined $len ;
>     return length $len;'

I couldn't get that to work. However, it *did* give me an idea:

sub mydiff {
    my($a,$b)[EMAIL PROTECTED];
    my($len)=unpack('B*',unpack('B*',$a)^unpack('B*',$b))=~/^((0{8})+)/;
    $a eq $b?undef:int(length($len)/64);
}
my $diff = &mydiff(@ARGV);
print defined($diff)?$diff:'undef'."\n";

> perl mydiff.pl A A
undef
> perl mydiff.pl A B
0
> perl mydiff.pl AA AA
undef
> perl mydiff.pl AA AB
1
> perl mydiff.pl AA AAB
2

I don't fully grok pack/unpack, especially 'B' fields, so I'm sure it
can be improved on.

-- 
Craig S. Cottingham
[EMAIL PROTECTED]

Reply via email to