in reply to Decoding Mapped Bitfields

I think vec is all you need for this. The $actions reference string can be treated as a vector of eight byte-sized chunks, and the $item character as a vector of eight bits. That will let each share an index for the correspondence you want (though it's necessary to be tricky to get the bit order you wanted).

our $actions = " ABCDEFG"; my $item = chr(0x37); my $newitem = join '', map { vec($item, 7-$_, 1) ? chr(vec $actions, $_, 8) : ' '; } 0 .. 7; print $newitem,$/; __END__ BC EFG
It may have been the need for the chr functions that was troubling you. Your $item was actually an integer.

Occasionally we hear from C programmers learning Perl that they really must have strings as an array of characters. Vec is the answer to that plea (as is substr). It's just awkward enough to move them to find a perlier way ;-)

After Compline,
Zaxo

Replies are listed 'Best First'.
Re^2: Decoding Mapped Bitfields
by sauoq (Abbot) on Oct 09, 2005 at 12:37 UTC

    Using chr(vec $actions, $_, 8) as a substitute for substr($actions, $_, 1) might confuse the issue here. The first use of vec() is the important one. I think you hit it exactly, though. He needed chr().

    -sauoq
    "My two cents aren't worth a dime.";