Как я могу перенаправить стандартный вывод в файл в Perl? - PullRequest
12 голосов
/ 25 мая 2010

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

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

Ответы [ 5 ]

29 голосов
/ 25 мая 2010

Из perldoc -f открыто:

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

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

6 голосов
/ 08 июля 2010

Как сказал 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 голосов
/ 25 мая 2010

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

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

3 голосов
/ 26 мая 2010

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

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

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

3 голосов
/ 25 мая 2010
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";
...