Perl:在"显示"上打印,也在文件中打印

Joh*_*Tan 4 printing string perl file

有没有办法在不重复打印"字符串"代码的情况下同时打印到"显​​示"和文件中?

我想做的事:

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

代替:

if ($ofile) { open (FILE, '>>', "file"); }
print "Hello";
if ($ofile) { print FILE "Hello"; }
Run Code Online (Sandbox Code Playgroud)

尝试使用谷歌搜索但我发现的只是或者,不是两个功能在一起.

编辑以添加问题:

然后使用IO :: Tee创建一个新的T形手柄,然后选择$ tee,以便print默认使用它. - Eric Strom

@EricStrom创建一个新的T恤手柄是什么意思?你是说这个Local::TeeOutput吗?search.cpan.org/~mschilli/Log-Log4perl-1.34/lib/Log/Log4perl.pm

@EricStrom你有一个例子吗?

@EricStrom Local :: TeeOutput在Strawberry Perl的默认库中不可用.在默认库中是否有任何替代方案?

obm*_*mib 9

当然,在CPAN上使用IO :: Tee.

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

要更改perl的默认句柄:

select $tee;
print "HELLO!\n";
Run Code Online (Sandbox Code Playgroud)

  • 然后使用`IO :: Tee`创建一个新的tee'd句柄,然后`select $ tee`,以便`print`默认使用它. (2认同)

par*_*mar 5

如果这是用于日志记录,请考虑使用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";
Run Code Online (Sandbox Code Playgroud)

配置说明当调用其中任何一个时,将附加文件(Logfile)和屏幕(Screen).INFOERROR

FAQ涵盖了更多的问题