If your lengths aren't necessarily multiples of 8,
my @fields;
my $bits = unpack('B*', $input);
while ($bits) {
die if length($bits) < 8;
my $num_bits = unpack('C', pack('B*', substr($bits, 0, 8, '')));
my $field = substr($bits, 0, $num_bits, '');
push @fields, $field;
}
You can probably do this more efficiently using bit twiddling, but this is simpler.
If you want the result as a number rather than a string of "1"s and "0"s, you can use the following:
use Config qw( );
use constant UV_BITS => $Config::Config{uvsize} * 8;
die if $num_bits > UV_BITS;
push @fields, pack('B*', substr(("0" x UV_BITS).$field, -UV_BITS));