Using bitwise operators won't work because te masked bytes will be null; which are still characters.
Faster that split would be to use unpack:
#! perl -slw use strict; print unpack 'x3a7x2a4x2a7', $_ while <DATA>; __DATA__ 0121012102??????????12121212???????? 0111011102??????????12111112???????? 0111011102??????????12111112????????
Produces:
C:\test>junk55 1012102??????12121 1011102??????12111 1011102??????12111
Possibly faster still would be to set up an array of substr refs into a single buffer:
#! perl -slw use strict; my $buf = chr(0) x 400_000; my @refs = map { \substr $buf, $_->[0], $_->[1] } [3,7],[12,4],[18,7]; while( <DATA> ) { substr( $buf, 0 ) = $_; print map $$_, @refs; } __DATA__ 0121012102??????????12121212???????? 0111011102??????????12111112???????? 0111011102??????????12111112????????
Produces:
C:\test>junk55 1012102??????12121 1011102??????12111 1011102??????12111
You'll have to benchmark to see if whether the latter which was once faster on some earlier version of perl still is on yours.
In reply to Re: using bits to print part of a string
by BrowserUk
in thread using bits to print part of a string
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |