私はを使用して、より高速な処理のために一部のテキストを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";
}
'fwrite'呼び出しの前に' echo($ raw_string) 'と書かれていることを確認してください – mob
私はすでに最後の段落で述べたようにしました。しかし、ありがとう!私は、書いた直前の生の文字列を調べたことをより明確にします。 – Cyan
perlスクリプトは何をしますか?入力データの読み方を教えてください。 – xxfelixxx