Программирование > Perl

open2 для Win

<< < (2/3) > >>

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 платформе у меня передалась только первая строка.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии