我正在从套接字读取空分开的数据块;在找到null时,到目前为止读取的块被移交进行处理,并且缓冲区被截断为null之后留下的任何内容(通常没有)。
do {
$in .= <$sock>
} while(!in =~ /^(.*?)\x00(.*)/) ;
print "A:[ $in, $block ]\n";
$block = $1;
$in = $2;
print "B:[ $in, $block ]";
结果:
A:[ {"hn":"ITtestKA","v":{"m":4,"u":4}}
, ]
B:[ , ]
为什么我无法从子表达式$1
,$2
中选择数据?
答案 0 :(得分:2)
另一个想法是更改值$/
,以确定<$sock>
从$sock
读取多少内容。例如,如果你这样做
local $/="\0"
然后对于该范围,<$sock>
将读取,直到下一个(空分隔)块结束。
编辑:如果输入由空值分隔的块组成,则<$sock>
使用$/
具有默认值是没有意义的,因为那样你就会逐行读取输入。所以我认为有两种方法:
$/
设为\0
并使用<$sock>
阅读下一个区块。<$sock>
并将$/
设置为块大小的引用(例如local $/=\4096
),或使用read
/ sysread
。在这种情况下,我还会使用index
/ substr
来搜索null并提取块。答案 1 :(得分:2)
绑定运算符有一个否定的形式:
while($in !~ /^(.*?)\x00(.*)/)
答案 2 :(得分:1)
in
和$in
是不同的事情。你使用strict吗?如果没有,那么您将"in"
与正则表达式匹配,它永远不匹配。
#! /usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my @socket = ( "abcd\x00efgh",
"ijkl",
"mnop\x00qrst",
"uvwx\x00",
);
my ($in, $block);
while (@socket) {
do {
$in .= shift @socket;
} while ($in !~ /^(.*?)\x00(.*)/) ;
say "A:[ $in, $block ]";
($block, $in) = ($1, $2);
say "B:[ $in, $block ]";
}