Программирование > Perl
open2 для Win
xmolex:
Все верно, только мне мультиплатформенность нужна.
vladsu:
--- Цитировать ---xmolex:
Все верно, только мне мультиплатформенность нужна.
--- Конец цитаты ---
Так уже хорошо. А теперь я скажу ещё раз: "И"?
То что я Вам привел точно работает на: Linux(RH, SuSE), AIX и Windows(куда же без него) - у меня работает, уверен и на маке работать будет, какие ещё Вам платформы нужны?
Теперь когда мы разобрались с технологией, можно подумать об оптимизации. Дело в том, что данный вариант может подойти к одной задаче, мои запросы, до сих пор, такой вариант удовлетворял, это когда передача идёт до нескольких мегов и на одной машине. А ведь можно всё сделать гораздо универсальней ни от чего не зависимо (объёмов, машин...), только это будет очень навороченно, но с бОльшим контролем - правда работать будет медленней.
Но это всё гадание, сами знаете на чём, т.к. я не знаю Вашу задачу. В любом случае ответ Вы получили, пробуйте, при конкретизации задачи могу дать более определённые рекомендации.
xmolex:
Хорошо. Конкретизирую.
Имеется файл 1.bin. Я хочу его открыть первой программой и передать второй.
##################################
# код первой программы
##################################
#!/usr/bin/perl
open(BIN, "1.bin");
$make = $_ foreach ();
close(BIN);
$feedback = qx(2.pl $make);
print $feedback;
##################################
# код второй программы
##################################
#!/usr/bin/perl
while () { $temp .= $_; }
if ($temp ne "") {print "OK";} else {print "NO";}
# конец программ
Дело в том, что когда я передаю $make, то это передается и считается командами оболочки, а не входным потоком запускаемой программы. В любом случае, если вы возьмете какой-нибудь avi файл к примеру и попытаетесь передать его, то получите кучу ошибок.
Пояснить командной оболочке, что вы передаете входной поток можно указав символ &, вот только из программы добиться правильного его использования у меня не вышло.
vladsu:
Хочется выругаться - выругаюсь кодом
/tmp/1.pl
--- Код: ---
#!/usr/local/bin/perl -w
use strict;
my $make;
open(BIN, "/tmp/3.bin"); # 3.bin - это мультик Шрек в ави размером 700М
$make .= \'"\'; # Одиночная, двойная и опять одиночная
while ( ) {
$make .= $_;
}
$make .= \'"\'; # Тоже что и выше
close(BIN);
my $feedback = qx(/tmp/2.pl $make);
print $feedback,"\\n";
--- Конец кода ---
/tmp/2.pl
--- Код: ---
#!/usr/bin/perl -w
use strict;
my $temp;
$temp = $ARGV[0];
if ($temp ne "") {print "OK";} else {print "NO";}
--- Конец кода ---
Результат:
/tmp> time ./1.pl
OK
real 0m12.555s
user 0m7.964s
sys 0m3.036s
Надеюсь при необходимости первый и последний байт отрезать сумеете? Те самые добавленные кавычки.
xmolex:
Хм, зачем ругаться? Если вы про не использование прагмы strict или про не объявление переменных, так это сделано для уменьшения сообщений на форуме, просто чтобы отобразить суть.
Что касается вашего примера, то он работоспособен, но лично у меня он не сработал до конца.
Попробуйте передать текстовый файл, где существуют переходы строки и символы " (двойной кавычки). Лично на win платформе у меня передалась только первая строка.
Навигация
Перейти к полной версии