无法从子表达式中获取值

时间:2016-09-20 13:34:30

标签: regex perl

我正在从套接字读取空分开的数据块;在找到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中选择数据?

3 个答案:

答案 0 :(得分:2)

另一个想法是更改值$/,以确定<$sock>$sock读取多少内容。例如,如果你这样做

local $/="\0"

然后对于该范围,<$sock>将读取,直到下一个(空分隔)块结束。

编辑:如果输入由空值分隔的块组成,则<$sock>使用$/具有默认值是没有意义的,因为那样你就会逐行读取输入。所以我认为有两种方法:

  1. $/设为\0并使用<$sock>阅读下一个区块。
  2. 读取固定大小的块,然后在其中搜索空字节以提取下一个块。在这种情况下,您可以使用<$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 ]";
}