Как перенаправить стандартный вывод на файл в Perl?

Я ищу пример перенаправления stdout в файл с помощью Perl. Я делаю довольно простой инструмент fork/exec, и я хочу перенаправить вывод child в файл вместо stdout для родителей.

Есть ли эквивалент dup2(), который я должен использовать? Я не могу найти его

Ответ 1

От perldoc -f open:

open STDOUT, '>', "foo.out"

Документы - ваш друг...

Ответ 2

Сам ребенок может сделать select $filehandle, чтобы указать, что все его вызовы print должны быть направлены на конкретный дескриптор файла.

Лучшее, что может сделать родитель, это использовать system или exec или что-то подобное для перенаправления оболочки.

Ответ 3

Как сказал 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"; 

Ответ 4

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";

Ответ 5

Строго информативный, но непрактичный ответ:

Хотя почти наверняка есть более элегантный способ обойти это, в зависимости от точных деталей того, что вы пытаетесь сделать, если вы абсолютно должны иметь dup2(), его эквивалент Perl присутствует в модуле POSIX. Однако в этом случае вы имеете дело с фактическими файловыми дескрипторами, а не с файловыми файлами Perl, и, соответственно, вам запрещено использовать другие предоставленные функции в модуле POSIX, все из которых аналогичны тому, что вы использовали бы на C. в какой-то степени вы бы написали C в очень не Perlish Perl.

http://perldoc.perl.org/POSIX.html