首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl数组(@data)到变量($data)

Perl数组(@data)到变量($data)
EN

Stack Overflow用户
提问于 2019-02-07 00:00:06
回答 2查看 85关注 0票数 3

我正在做套接字编程。从套接字接收的数据($ data)包含4个字节的长度数据+ json数据。我想修剪长度,只解析json。

我已经完成了代码,它工作得很好。但我想知道是否有更有效的方法(算法)。

在perl中,有没有一种将数组转移到变量的有效方法?

代码语言:javascript
运行
复制
@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 ; 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-07 00:04:47

这是pack/unpack的标准用例。N/a模板将解压一个长度为N (按网络字节顺序)的字符串:

代码语言:javascript
运行
复制
my( $json ) = unpack 'N/a', $data;
print $json;
票数 2
EN

Stack Overflow用户

发布于 2019-02-07 01:54:48

如果你有你所说的东西,你可以简单地去掉长度前缀。

代码语言:javascript
运行
复制
my $json = substr($data, 4);

但这将意味着长度前缀是无用的,这表明您在程序的早期有一个主要的bug。您是否正确地从套接字读取?

代码语言:javascript
运行
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54557725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档