我正在使用下面的perl脚本,
open (STDOUT, '>',"log.txt")|| die "ERROR: opening log.txt\n";
print "\n inside";
close (STDOUT);
print "\noutside";
我需要字符串"内部"需要在log.txt中打印。字符串"外部"需要在控制台中打印。
但是我的脚本字符串"内部"在log.txt中打印,但字符串"在"之外没有打印在控制台上。
任何人都可以帮助我吗
答案 0 :(得分:2)
您redirect the standard output stream到open STDOUT, '>', $file
的文件。之后,没有简单的方法可以打印到控制台。
打印文件和控制台的一些方法
在重定向之前保存STDOUT
,并在以后需要时将其恢复。再次,请参阅open
open SAVEOUT, ">&STDOUT" or warn "Can't dup STDOUT: $!";
open *STDOUT, ">", $logfile or warn "Can't redirect STDOUT to $logfile: $!";
say "goes to file";
...
open STDOUT, ">&SAVEOUT" or warn "Can't reopen STDOUT: $!"; # restore
say "goes to console";
打印到您想要控制台的变量;使用select切换打印位置的默认值
open my $fh_so, '>', \my $for_stdout;
select $fh_so;
say "goes to variable \$for_stdout";
say STDOUT "goes to console";
...
select STDOUT; # make STDOUT default again
say $for_stdout; # goes to console (all accumulated $fh_so prints)
使用此功能,您可以通过指定STDOUT
来访问控制台,否则在select
返回STDOUT
直接将日志打印到文件,如Jens's answer
open my $fh_log, '>', $logfile or die "Can't open $logfile: $!";
say $fh_log "goes to $logfile";
say "goes to console";
...
close $fh_log;
默认print
(或更确切地说say
)继续进入控制台
前两个看起来有点麻烦,不是。我建议将日志直接打印到日志文件中,除非需要为大部分程序重定向STDOUT
,或者您有令人信服的理由select
文件句柄。
对于say
,它会为打印内容添加换行符,您需要在开头use feature 'say';
。
始终使用use warnings;
和use strict;
启动您的计划。