简体   繁体   中英

Perl array(@data) to variables($data)

I am doing socket programming. The data ($ data) received from the socket contains 4 bytes of length data + json data. I want to trim the length and only parse the json.

I have completed the code and it works fine. But I wonder if there is a more efficient way (algorithm).

Is there an efficient way to move arrays to variables in perl?

@tmpp = split(//,$data); #data = socket data

my $t1 = sprintf("%02x%02x%02x%02x",ord($tmpp[0]),ord($tmpp[1]),ord($tmpp[2]),ord($tmpp[3])); 
$t1 = hex($t1); #t1 = length 

my $json;
my @tmp = @tmpp[0..-1];
foreach(@tmp){ $json .= $_;}<br>
print $json;

Ok Print ; 

This is a standard case for pack/unpack . The N/a template will unpack a string of length N (in network byte order):

my( $json ) = unpack 'N/a', $data;
print $json;

If you have what you say you have, you could simply peel off the length prefix.

my $json = substr($data, 4);

But this would mean that the length prefix is useless, which suggests you have a major bug earlier in your program. Did you properly read from the socket?

sub read_bytes {
   my ($fh, $bytes_to_read) = @_;
   my $buf = '';
   while ($bytes_to_read) {
      my $bytes_read = read($fh, $buf, $bytes_to_read, length($buf))
      die($!) if !defined($bytes_read);
      die("Premature EOF") if !$bytes_read;
      $bytes_to_read -= $bytes_read;
   }

   return $buf;
}

sub read_uint32be { unpack('N', read_bytes($_[0], 4)) }

sub read_string {
   my ($fh) = @_;
   my $len = read_uint32be($fh);
   return read_bytes($fh, $len);
}

my $json = read_string($sock);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM