2016-10-13 8 views
0

Я использую proc_open, чтобы передать текст поверх скрипта 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 

я мог бы быть в состоянии избежать проблемы путем преобразования форматирования моего входа, но по разным причинам, что нежелательно, и обходит, а не решает, ключевую проблему.

Кроме того, я знаю, что проблема возникает где-то между скриптом php и скриптом perl, потому что я изучил необработанный текст (с echo) непосредственно перед тем, как записать его в протокол STDIN скриптов perl, и я проверил мои perl непосредственно на url-закодированные строки.

Теперь я добавил скрипт 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

'echo ($ raw_string)' перед вызовом 'fwrite' и посмотреть, что он говорит – mob

+0

Я уже сделал это, как упоминалось в моем последнем абзаце. Спасибо хоть! Я разъясню, что я исследовал необработанную строку непосредственно перед письмом. – Cyan

+0

Что делает скрипт perl? Не могли бы вы показать, как он считывает входные данные? – xxfelixxx

ответ

0

Примечание для себя: всегда проверяйте свои предположения. Оказывается, что где-то в моих сотнях миллионов строк ввода были, фактически, буквальные пространства, где должны были быть закодированные в url пространства. Понадобилось некоторое время, чтобы найти их, поскольку было сотни миллионов правильных литералов, но они были.

Извините, ребята!