2016-09-20 18 views
0

ソケットからヌル区切りのデータブロックを読み込んでいます。 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

'厳格な使用は、' '警告を使用;'あなたの友達です、そして、あなたのコード内の大規模な問題がある場所を強調するかもしれません。 – Sobrique

答えて

2

もう一つのアイデアは、<$sock>$sockから読み込みますどのくらいを決定する値$/を変更することです。あなたは

local $/="\0" 

を行うのであれば、たとえば、その範囲のために、<$sock>は、次の(ヌル区切り)ブロックの最後まで読みます。

編集:入力がNULLで区切られたブロックから構成されている場合、それはあなたがラインでの入力行を読み取ることになるので、そのデフォルト値を持つ$/<$sock>を使用しても意味がありません。

  1. \0に設定$/と、次のブロックを読み取るために<$sock>を使用します。だから私は2つのアプローチがあると思います。
  2. 固定サイズのチャンクを読み取り、その中のヌルバイトを検索して次のブロックを抽出します。このシナリオでは、<$sock>$/をチャンクサイズの参照(例:local $/=\4096)に設定するか、read/sysreadを使用します。また、ヌルを検索し、その場合はチャンクを抽出するのにindex/substrを使用します。
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 ]"; 
} 
2

結合演算子の否定形があります:

while($in !~ /^(.*?)\x00(.*)/) 
+0

[brian d foy](http://stackoverflow.com/users/2766176/brian-d-foy)「バグ修正」をありがとう。 – Gilbert

関連する問題