Перенаправление STDOUT трубы в Perl - PullRequest
2 голосов
/ 06 ноября 2010

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

open(my $foo, '|-', '/path/to/foo');
print $foo 'input'; # Should behave equivalently to "print 'output'"
close($foo);

Есть ли простойспособ сделать это, или я наткнулся на один из многих моментов "не могу добраться отсюда" в Perl?

1 Ответ

5 голосов
/ 06 ноября 2010

Подпроцесс автоматически унаследует STDOUT. Это работает для меня:

open(my $f, "|-", "cat");
print $f "hi\n";

Если вы на самом деле не закрываете канал немедленно, проблема может быть на другом конце: STDOUT по умолчанию является буферизованным строкой, поэтому вы сразу видите print "hello world\n". Канал к вашему подпроцессу будет по умолчанию буферизироваться в блоке, поэтому вы можете ожидать, что данные из вашего сценария Perl достигнут другой программы:

open(my $f, "|-", "cat");
print $f "hi\n";
sleep(10);
close($f); # or exit
# now output appears

Попробуйте добавить select $f; $| = 1 (или я думаю, что более современный способ - $f->autoflush(1))

...