2011-12-23 88 views
4

有什么方法可以同时打印到“显​​示器”和文件中,而不必重复打印“字符串”代码?Perl:在“显示器”上打印,也打印到文件中

我想做什么:的

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

试着用搜索引擎,但所有我发现要么,或者不是两个特征组合在一起。

编辑补充问题:

然后使用IO :: T恤,以创建一个新的tee'd处理,然后选择$ T恤,使打印默认使用它。 - 埃里克斯特罗姆

@EricStrom你是什么意思创建一个新的tee'd句柄?你的意思是Local::TeeOutput? search.cpan.org/~mschilli/Log-Log4perl-1.34/lib/Log/Log4perl.pm

@EricStrom你有个例子吗?

@EricStrom Local :: TeeOutput在Strawberry Perl的默认库中不可用。有没有其他的选择在默认库里面?

回答

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

的配置示出了任一INFOERROR等被称为当两个文件(日志文件)和屏幕(屏幕)将被附加。

FAQ占地问题

+0

这个api是否必须安装或者是否预安装了Strawberry Perl? – 2011-12-23 19:33:22

+0

@ parapura-rajikumar我只需要打印出一些东西。我是否使用Log4perl的print_portfolio子功能? – 2011-12-23 19:43:48

+0

@JohnTan请看我的编辑回答。我有一个完整的例子。如果你的perl安装还没有安装,你将不得不安装Log4perl。一旦你掌握了它的一切你将停止所有打印:) – 2011-12-24 17:00:11

1

为什么不子程序的任务是什么?

此外,许多日志包如Log::Log4perl支持通过相当简单的配置写入控制台和文件。

+0

我只需要打印出来。我是否使用Log4perl的print_portfolio子功能? – 2011-12-23 19:44:54

+0

@JohnTan - 在这种情况下,为什么不制作将其参数发送到两个流的子程序'print_out'? Log4perl可能不会提供你想要的。 – bvr 2011-12-23 20:32:03

9

当然,在CPAN上有IO::Tee

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

要改变Perl的默认手柄:

select $tee; 
print "HELLO!\n"; 
+0

嗯,这不是我要找的。我试图保持它与原始印刷品的相同的确切路线。 – 2011-12-23 19:34:22

+2

然后使用'IO :: Tee'创建一个新的Tee'd句柄,然后'选择$ tee',这样'print'默认使用它。 – 2011-12-23 21:03:23

+0

@EricStrom你是什么意思创建一个新的Tee'd手柄?你的意思是这个Local :: TeeOutput]? http://search.cpan.org/~mschilli/Log-Log4perl-1.34/lib/Log/Log4perl.pm – 2011-12-23 22:10:35