2014-02-07 3 views
2

У меня есть дескриптор файла, который содержит сжатые данные в $ my_fd. Я хотел бы запустить программу декомпрессии (например, «lzop -dc») с перенаправлением $ my_fd в качестве стандартного ввода, поэтому я могу прочитать распакованный вывод в $ out_fd. Как я использую STDIN в другом месте этого код не работает (но это показывает идею):

# Save STDIN file handle 
open(my $stdin_copy, "<&", "STDIN");                      
my $fd = $my_fd;                           
# Replace STDIN with the file handle 
open(STDIN, "<&", $fd); 
# Start decompression with the fake STDIN 
open($out_fd, "-|", $opt::decompress_program);                    
# Put STDIN file handle back 
open(STDIN, "<&", $stdin_copy); 
# Do stuff on the decompressed data 
while(<$out_fd>) { ... } 
# Do more stuff on the original STDIN 

Оба входа ($ FD) и выход ($ out_fd) может быть больше, чем физическая память, так что это не вариант читать все это.

фон

Это будет использоваться для --compress в GNU Parallel.

ответ

1

Не нужно забивать STDIN. Используйте IPC::Open2 или IPC::Run для использования внешней программы с произвольными входными/выходными потоками.

use IPC::Open2; 

# use $fd as input and $out_fd as output to external program 
$pid = open2($fd, $out_fd, $opt::decompress_program); 
close $fd; 
while (<$out_fd>) { 
    ... 
} 

(Используйте IPC::Open3, если вы заинтересованы в стандартный поток ошибок из внешней программы)

Смежные вопросы