Подпроцесс автоматически унаследует 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)
)