Я ищу пример перенаправления stdout в файл с помощью Perl. Я делаю довольно простой инструмент ветвления/должностного лица, и я хочу перенаправить вывод ребенка в файл вместо родителей stdout.
Есть ли equivilant dup2()
Я должен использовать? Я, может казаться, не нахожу его
Из perldoc -f open:
open STDOUT, '>', "foo.out"
Документы - это ваши друг ...
Сам дочерний элемент может выполнить select $ filehandle
, чтобы указать, что все его вызовы print
должны быть направлены на определенный дескриптор файла.
Лучшее, что может сделать родитель, - это использовать system
или exec
или что-то в этом роде для перенаправления оболочки.
open my $fh, '>', $file;
defined(my $pid = fork) or die "fork: $!";
if (!$pid) {
open STDOUT, '>&', $fh;
# do whatever you want
...
exit;
}
waitpid $pid, 0;
print $? == 0 ? "ok\n" : "nok\n";
Сугубо информационный, но непрактичный ответ:
Хотя почти наверняка существует более элегантный способ решения этой задачи в зависимости от точных деталей того, что вы пытаетесь сделать, если вам абсолютно необходимо иметь dup2()
, его Perl-эквивалент присутствует в модуле POSIX
. Однако в этом случае вы имеете дело с реальными дескрипторами файлов, а не с файловыми дескрипторами Perl, и, соответственно, вы ограничены в использовании других функций модуля POSIX, все из которых аналогичны тем, что вы используете в C. В некоторой степени, вы будете писать C на очень неперламутровом Perl.
Как сказал JS Bangs, простым способом перенаправления вывода является использование оператора 'select'.
Большое спасибо stackoverflow и их пользователям. Надеюсь, это будет полезно
например:
print "to console\n";
open OUTPUT, '>', "foo.txt" or die "Can't create filehandle: $!";
select OUTPUT; $| = 1; # make unbuffered
print "to file\n";
print OUTPUT "also to file\n";
print STDOUT "to console\n";
# close current output file
close(OUTPUT);
# reset stdout to be the default file handle
select STDOUT;
print "to console";