The example code in my first reply was based on certain assumptions, in particular, that the data you are dealing with is raw binary. My example code may have no bearing on the actual problem you face.
$length = unpack "C4", substr $data,0,2,'';
As to your code, my interpretation is:
-
Two characters are taken from the beginning of the string $data and replaced with the empty string;
-
An attempt is made to unpack four unsigned bytes from the extracted two-character string;
-
Then the first of the four unpacked bytes (only two of which can actualy exist) is stored in $length and the rest are thrown away.
This doesn't really seem to make a lot of sense. See code example below.
>perl -wMstrict -le
"my $data = 'ABCDEF';
my $len = unpack 'C4', substr $data, 0, 2, '';
print $len;
print qq{'$data'};
"
65
'CDEF'