PHP передает переменные в Perl, возникают проблемы с использованием пробелов между методами переменных, есть ли другой, лучший способ? - PullRequest
2 голосов
/ 16 августа 2010

Мне все чаще приходится использовать Perl, поскольку регулярные выражения PHP заставляют меня задуматься о том, что происходит в половине случаев, поскольку они просто не отвечают так, как должны (как, например, когда я использую Perl). .. я использовал этот метод для вызова perl (до того, как начал пытаться делать это с помощью регулярных выражений) .. передача строки регулярного выражения в качестве переменной вызывает всевозможные проблемы, такие как использование "()" в любом месте делает его не работать, между прочим .. Мне интересно, есть ли лучший способ сделать это, чем строка переменных после метода имени файла perl, поскольку он, кажется, имеет некоторые явные ограничения ... спасибо за любую информацию.

как я это делаю сейчас:

$file = "/pathtomy/perlscript.pl $var1 $var2 $var3" ;
    ob_start();
passthru($file);
$perlreturn = ob_get_contents();
ob_end_clean();
return $perlreturn;

Ответы [ 2 ]

2 голосов
/ 16 августа 2010

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

string escapeshellarg  ( string $arg )

escapeshellarg() добавляет одинарные кавычки вокруг строки и заключает в кавычки / экранирует любые существующие одинарные кавычки, позволяя передавать строку непосредственно в функцию оболочки и обрабатывать ее как один безопасный аргумент. Эта функция должна использоваться для экранирования отдельных аргументов функций оболочки, поступающих от пользовательского ввода. Функции оболочки включают exec(), system() и оператор backtick .

Использование простой Perl-программы, которая печатает аргументы командной строки

#! /usr/bin/perl

$" = "][";  # " fix StackOverflow highlighting
print "[@ARGV]\n";

а затем модифицированная версия программы PHP из вашего вопроса

<?php

$var1 = "I'm a";
$var2 = "good boy,";
$var3 = "I am.";

$file = "./prog.pl " . implode(" ",
                         array_map("escapeshellarg",
                           array($var1,$var2,$var3)));
echo "command=", $file, "\n";

ob_start();
passthru($file);
$perlreturn = ob_get_contents();
ob_end_clean();
echo "return=", $perlreturn;

?>

мы видим следующий вывод:

$ php prog.php 
command=./prog.pl 'I'\''m a' 'good boy,' 'I am.'
return=[I'm a][good boy,][I am.]
0 голосов
/ 16 августа 2010

Попробуйте использовать кавычки:

$file = "/pathtomy/perlscript.pl '$var1' '$var2' '$var3'" ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...