Perl: печать на «дисплее», а также в файл - PullRequest
4 голосов
/ 23 декабря 2011

Можно ли печатать как на «дисплее», так и в файле одновременно, не повторяя код «строки» для печати?

Что я хочу сделать:

if ($ofile) {
   open (FILE, '>>', "file");
   print "Hello" #some code#; #prints on the display and into the file
}

вместо:

if ($ofile) { open (FILE, '>>', "file"); }
print "Hello";
if ($ofile) { print FILE "Hello"; }

Попробовал поискать в Google, но все, что я нашел, было либо, либо не обе функции вместе.

Изменить, чтобы добавить вопросы:

Затем используйте IO :: Tee для создания нового дескриптора tee'd, а затем выберите $ tee, чтобы print использовал его по умолчанию. - Эрик Стром

@ EricStrom Что вы подразумеваете под созданием новой ручки для тройника? Вы имеете в виду это Local::TeeOutput? search.cpan.org/~mschilli/Log-Log4perl-1.34/lib/Log/Log4perl.pm

@ EricStrom У вас есть пример?

@ EricStrom Local :: TeeOutput недоступен в библиотеке по умолчанию для Strawberry Perl. Есть ли альтернатива внутри библиотеки по умолчанию?

Ответы [ 4 ]

9 голосов
/ 23 декабря 2011

Конечно, с IO :: Tee на CPAN.

my $tee = IO::Tee->new( \*STDOUT, \*STDERR, $John, $Tan );
print $tee "HELLO!\n";

Чтобы изменить дескриптор по умолчанию для Perl:

select $tee;
print "HELLO!\n";
5 голосов
/ 23 декабря 2011

Если это для ведения журнала, попробуйте использовать Log :: Log4perl

Вы можете иметь один и тот же материал журнала на экран, файл и даже базу данных.

Это полный пример регистрации на экране и в файле.

use strict;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init("INFO");

my $logConfiguration = qq(
log4perl.logger        = INFO, Logfile, Screen
log4perl.appender.Logfile          =  Log::Log4perl::Appender::File
log4perl.appender.Logfile.filename = C:\\temp\\file.log
log4perl.appender.Logfile.layout   = Log::Log4perl::Layout::PatternLayout
log4perl.appender.Logfile.layout.ConversionPattern =%p[%d{MM/dd HH:mm} %3L] %m%n
log4perl.appender.Screen         = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.stderr  = 0
log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout
log4perl.appender.Screen.layout.ConversionPattern = %m%n
);

Log::Log4perl::init( \$logConfiguration );

INFO "This line will be logged";

ERROR "This error will be logged";

LOGDIE "Fatal error will be logged";

Конфигурация иллюстрирует, что файл ( Logfile ) и экран ( Screen ) будут добавлены при вызове либо INFO, ERROR и т. Д.

FAQ охватывает больше вопросов

1 голос
/ 23 декабря 2011

Почему бы не сделать подпрограмму для задачи?

Кроме того, многие пакеты журналирования, такие как Log :: Log4perl , поддерживают запись в консоль и в файл с помощью довольно простой конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...