2016-10-13 7 views
0

私はを使用して、より高速な処理のために一部のテキストをperlスクリプトにパイプします。テキストには、URLエンコードされた文字列とリテラルスペースが含まれます。生のテキストにURLエンコードされたスペースが現れると、それはperlスクリプトに到達するまでにリテラルスペースにデコードされるようです。 perlスクリプトでは、リテラルスペースの位置付けに依存しているので、これらの不要なスペースが私の出力を混乱させます。php - perlプロセスへのパイプ入力は、自動的にURLエンコードされた文字列をデコードします。

なぜこのようなことが起こっているのですか?それが起こらないようにする方法がありますか?

関連するコードスニペットは:

$descriptorspec = array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w"), 
); 
$cmd = "perl script.pl"; 
$process = proc_open($cmd, $descriptorspec, $pipes); 
$output = ""; 

if (is_resource($process)) { 
    fwrite($pipes[0], $raw_string); 
    fclose($pipes[0]); 
    while (!feof($pipes[1])) { 
     $output .= fgets($pipes[1]); 
    } 
    fclose($pipes[1]); 
    proc_close($process); 
} 

と生テキスト入力のラインは次のようになります。

key url\tvalue1\tvalue2\tvalue3 

私は私の入力のフォーマットを変換することによって、問題を避けることができるかもしれません、しかし、それは望ましくない様々な理由から、解決するのではなく回避することが重要な問題です。

さらに、私はすぐにPerlスクリプトSTDINパイプに書き込む前に(echo付き)生のテキストを検討している、と私は私がテストしているので問題はPHPスクリプトやperlスクリプトの間のどこかで発生していることを知っていますurlでエンコードされた生の文字列の直接のperlスクリプト。

私は今、以下のperlスクリプトを追加しました。それは基本的にミニマップ削減の仕事に沸きます。

use strict; 

my %rows; 
while(<STDIN>) { 
    chomp; 
    my @line = split(/\t/); 
    my $key = $line[0]; 
    if (defined @rows{$key}) { 
     for my $i (1..$#line) { 
      $rows{$key}->[$i-1] += $line[$i]; 
     } 
    } else { 
     my @new_row; 
     for my $i (1..$#line) { 
      push(@new_row, $line[$i]); 
     } 
     $rows{$key} = [ @new_row ]; 
    } 
} 

my %newrows; 
for my $key (keys %rows) { 
    my @temparray = split(/ /, $key); 
    pop(@temparray); 
    my $newkey = join(" ", @temparray); 
    if (defined @newrows{$newkey}) { 
     for my $i (0..$#{ $rows{$key}}) { 
      $newrows{$newkey}->[$i] += $rows{$key}->[$i] > 0 ? 1 : 0; 
     } 
    } else { 
     my @new_row; 
     for my $i (0..$#{ $rows{$key}}) { 
      push(@new_row, $rows{$key}->[$i] > 0 ? 1 : 0); 
     } 
     $newrows{$newkey} = [ @new_row ]; 
    } 
} 

for my $key (keys %newrows) { 
    print "$key\t", join("\t", @{ $newrows{$key} }), "\n"; 
} 
+0

'fwrite'呼び出しの前に' echo($ raw_string) 'と書かれていることを確認してください – mob

+0

私はすでに最後の段落で述べたようにしました。しかし、ありがとう!私は、書いた直前の生の文字列を調べたことをより明確にします。 – Cyan

+0

perlスクリプトは何をしますか?入力データの読み方を教えてください。 – xxfelixxx

答えて

0

注意:あなたの前提を常に確認してください。私の何億もの入力行のどこかに、実際にはURLでエンコードされたスペースがあるはずの文字通りのスペースがあったことがわかります。それは数百万の正しい文字通りのスペースがあったので、それらを見つけるのにしばらくかかったが、そこにあった。

ごめんなさい!

関連する問題