# "X" means "back up one byte" my @recs = unpack 'C8a6A*XC', $inbuf; chop $recs[-2]; # remove final "tail_len" C from the string # - or - my @recs = $inbuf=~m{\A (.) (.)(.)(.)(.)(.)(.)(.) (.{6}) (.*) (\1) \z}msxaa or die "didn't match"; $_=ord for @recs[0..7,10];