[Pdx-pm] bit wise comparison

Steve Cayford scfrd1 at gmail.com
Thu Feb 11 13:46:27 PST 2010


As far as I can tell, the pack commands are superfluous. They're just 
saying take this string and pack it into a string.

This works fine with the original strings...

print scalar(
     ("ACCTCCTCCTCGAGTATGTG" ^ "TATCTTGCGCCGGAGATAAT") =~ tr/\x0/\x0/
   ), "\n";

The tr/\x0/\x0/ is transliterating bytes that have zeroed out bits, not 
ASCII zeros.

-Steve

Tom Keller wrote:
> Greetings,
> A Bioperl list I'm on gave the following as a fast string comparison method:
> 
> #################################
>> $in = 'ACCTCCTCCTCGAGTATGTG';
>> $tgt = 'TATCTTGCGCCGGAGATAAT';
>> $mask = pack("A*",$in)^pack("A*",$tgt);
>> $matches = $mask =~ tr/"\x0"/"\x0"/;
> 
> Impressive! Not often you see pack() let alone exclusive-or with a
> scalar context tr// thrown in for good measure!
> 
> For those who don't follow what it is doing, here is my (possibly
> wrong) interpretation: The pack() is converting each of the two (equal
> length) strings into a byte set. A bit-wise exclusive-or (XOR) is
> performed between these two byte sets. This will create bytes of value
> zero (0) where they were the same, and non-zero where they were
> different. The tr// then counts how many of the bytes were zero (\x0
> is ascii zero).
> #################################
> 
> I can't get it to work on my machine. Would someone be able to help me 
> with this?
> 
> For one thing, isn't ascii zero "x30" in hex? But even with that change, 
> I get no return value for $matches in:
> my $matches = $mask =~ tr/"\x30"/"\x30"/;
> 
> thanks,
> 
> Tom Keller
> MMI DNA Services Core 
> <http://www.ohsu.edu/xd/research/research-cores/dna-analysis/>
> 4-2442
> kellert at ohsu edu <mailto:kellert at ohsu.edu>
> RJH (CROET/BasicScience) 6339b
> 
> 


More information about the Pdx-pm-list mailing list