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

Я ищу пример перенаправления stdout в файл с помощью Perl. Я делаю довольно простой инструмент ветвления/должностного лица, и я хочу перенаправить вывод ребенка в файл вместо родителей stdout.

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

12
задан brian d foy 23 September 2010 в 07:21
поделиться

5 ответов

Из perldoc -f open:

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

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

29
ответ дан 2 December 2019 в 03:22
поделиться

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

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

4
ответ дан 2 December 2019 в 03:22
поделиться
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";
3
ответ дан 2 December 2019 в 03:22
поделиться

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

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

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

3
ответ дан 2 December 2019 в 03:22
поделиться

Как сказал 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"; 
6
ответ дан 2 December 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: