Нужно запустить внешнюю программу так, чтобы можно было послать ей на вход данные и прочитать данные с выхода. Как в sh: Код (Text): $ sort <list >result Нужно отсортировать по имени список файлов (это делает программа sort). Не хочу создавать временный файл со списком, а хочу сразу посылать его на вход sort. Обрат. кавыки возвращают только вывод команды в массиве: Код (Text): `sort` Понял, что так: Код (Text): open(FN, "| sort |") - нельзя, запрещается открывать open'ом сразу 2 конвейера. Подходящие варианты: Код (Text): use FileHandle; use IPC::Open2; $pid = open2(*Reader, *Writer, "cat -u -n" ); print Writer "stuff\n"; $got = <Reader>; Или создание 2-х pipe'ов: Код (Text): pipe(PARENT_RDR, CHILD_WTR); pipe(CHILD_RDR, PARENT_WTR); CHILD_WTR->autoflush(1); PARENT_WTR->autoflush(1); и порождение дочернего процесса: Код (Text): if ($pid = fork) { # parent close PARENT_RDR; close PARENT_WTR; ... } else { # child close CHILD_RDR; close CHILD_WTR; который сделает перенаправление дескрипторов pipe на STDIN и STDOUT и вызовет system('sort') или сделает open2. К сожалению, оба варианта не работают (программа не отвечает и ничего не выводит на экран). Буферизацию отключаю: Код (Text): select((select(STDIN), $|=1)[0]); select((select(STDOUT), $|=1)[0]); или Код (Text): use IO::Handle; ... CHILD_WTR->autoflush(1); PARENT_WTR->autoflush(1);
Не совсем понятно что ты хочешь. sort же по-идее на вход принимает имя файла и в то же время ты не хочешь создавать временный файл. И почему обязательно вызывать sort, если можно отсортировать перлом или там большой объем данных?
Kaimi Это *nix, сынок. =) sort, будучи запущенна без аргументов, читает входные данные из stdin, и пишет отсортированные в stdout. stdin и stdout возможно перенаправить, чтобы напрямую соединить sort с другим процессом. В качестве примера: Код (Text): du -x . | sort -n | tail Этой командой я пользуюсь, когда мне очень хочется освободить место на диске, и я не знаю что удалить.
pivikov Спасибо, сам пользуюсь этой книгой. EvilsInterrupt То же самое говорят поклонники Perl'а тем, кто программирует на Python. Не надо говорить "выбрось", говорите "попробуйте". r90 Спасибо, это помогло. Но как сделать тоже самое пайпами с файловыми дескрипторами?