2015-02-05 1 views
0

Кажется, есть два способа получить ввод/вывод другой программы в Perl, один из них окружает программу аргументами `, другой использует open, как показано ниже, любая разница между этими 2 и какая из них предпочтительнее ?Каков предпочтительный способ получения ввода-вывода другой консоли в Perl?

# 2 options to get the I/O of another program 
1. $output = `program`; 
2. open(PIPE, 'program |'); 
+0

Это не единственные пути. Например. при использовании 'open', всегда используйте [версию с несколькими аргументами] (http://perldoc.perl.org/functions/open.html) и передавайте аргументы команды в виде списка, если можете, чтобы избежать излишнего вызова оболочки и интерполяция. – reinierpost

ответ

1

Трубы полезны, когда вы хотите читать результаты процесса во времени. Предположим, вы хотите контролировать файл журнала.

Вы можете, например, написать:

open(PIPE, 'tail -f log.txt |'); 

while (<PIPE>) { 
    chomp; 
    print("NEW LINE: $_\n"); 
} 

и делать какое-то действие на добавляется каждая новая линия в журнал.

Если вы должны были написать:

$output = `tail -f log.txt`; 
println($output); 

Тогда ваша программа никогда не будет на самом деле добраться до Println части, так как команды в обратные кавычки, будет ждать, пока команда не вернулась.

2

Ваш второй случай, как представляется, обжигающе к «программы», а не получать информацию от него.

Если вы имеете в виду (и я думаю, что вы делаете):

open(PIPE, "program |") 

то преимущество труб в том, что вы можете обработать запись-на-записи, и вы не потребляют весь процесс-х вывода в один проход (как это происходит в первом сценарии). Это было бы лучше с точки зрения памяти и, возможно, с точки зрения времени, если программа работает в течение длительного периода.

Возможность подключения к трубе от stdin, а затем вы можете организовать свои трубы в командной строке и при необходимости обеспечить дополнительную фильтрацию и т. Д., А не жестко кодировать зависимость от конкретного двоичного файла.

1

Есть много различных способов общения между процессами в Perl - так много, что есть целый раздел документации по нему perlipc

Для простых требований, это действительно не имеет значения, что вы используете. Я бы сказал - используйте то, что наиболее очевидно, учитывая контекст.

Если вы просто запустив команду и захватывая вывод в виде блока:

my $df_out = `df -h`; 

Затем рассмотрит обратные кавычки наиболее подходящими.

Если вы хотите сделать линейный разбор - обратные выходы будет работать, но в целом я предпочел бы open.

E.g.

open (my $ssh_data, "-|", "ssh -n $hostname df"); 
my %size_of; 
while (<$ssh_data>) { 
    my ($fs, $total, $used, $avail) = split; 
    $size_of{$fs} = $total; 
} 
close ($ssh_data); 

IPC::Open2 и IPC::Open3 также варианты, чтобы позволить двунаправленную связь.

Одно предупреждение - я настоятельно рекомендую не, используя 2 аргумента open и используя лексические дескрипторы файлов. Хорошая привычка тренироваться - даже если это неважно сейчас привыкание к 3-arg open стоит делать.

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