($flag1, $bytecount, $mystery, $flag2) = $frame =~ m{ ^ ( [01]{8} ) ( [01]{16} ) ( [01]*? ) # that could be [01]* for all I care... ( [01]{8} ) $ }x; #### ($flag1, $bytecount, $mystery) = unpack "A8 A16 A*", $frame; $flag2 = substr($mystery, -8, 8, '');