in reply to Run length encode a bit vector

Not sure if this helps or not:

use strict; use warnings; my $bytes = pack 'N', 0x01020304; my $bits = unpack('B32', $bytes); my @counts; while ($bits =~ /(0+|1+)/g) { push @counts, length($1) * (substr($1, 0, 1) == 1 ? 1 : -1); } print "$bits\n@counts";

Output:

00000001000000100000001100000100 -7 1 -6 1 -7 2 -5 1 -2

Replies are listed 'Best First'.
Re^2: Run length encode a bit vector
by ikegami (Patriarch) on Jan 05, 2012 at 19:28 UTC

    The parent could use B* instead of B32.

    Methods that rely on unpack('B*', $bytes) can even handle arbitrary long packed string if they are packed in "network" (big endian) order.

    my $bytes = pack 'N*', 0x01020304, 0x05060708; my $bits = unpack 'B*', $bytes; ...

    (By the way, the == 1 is superfluous in the parent's code.)

      Odd, I would have thought that 0 as a string would still trigger true, and that in this context the pattern match would return 0 as a string. But I tested just now and you're correct, it works the same way without the ==.

        Zero is false, no matter if it's stored in an IV, UV, NV or PV.