我是Perl的新手.我正在编写一些脚本,并希望定义我自己的打印调用myprint(),它将根据一些标志打印传递给它的东西(详细/调试标志)
open(FD, "> /tmp/abc.txt") or die "Cannot create abc.txt file";
print FD "---Production Data---\n";
myprint "Hello - This is only a comment - debug data";
Run Code Online (Sandbox Code Playgroud)
有人可以帮我提供一些示例代码来实现myprint()功能吗?
您是否更关心编写自己的日志记录系统,或者您是否想知道如何将日志记录语句放在程序的相应部分中,以便关闭它们(并且在关闭时会产生很少的性能损失)?
如果您想要一个易于开始使用的日志记录系统,而且还提供了一个可以逐步发现和使用的功能,Log :: Log4perl是一个不错的选择.它有一个简单模式,允许您指定所需的日志记录级别,并仅发出高于所需级别的日志消息.
#!/usr/bin/env perl
use strict; use warnings;
use File::Temp qw(tempfile);
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init({level => $INFO});
my ($fh, $filename) = tempfile;
print $fh "---Production Data---\n";
WARN 'Wrote something somewhere somehow';
Run Code Online (Sandbox Code Playgroud)
该代码段还显示了使用File :: Temp打开临时文件的更好方法.
至于覆盖内置打印件 ......除非在非常特殊的情况下,否则使用内置插件并不是一个好主意.perldoc perlsub有一个关于覆盖内置函数的部分.这个问题的接受答案列出了无法覆盖的Perl内置函数.print就是其中之一.
但是,真的不需要覆盖内置来编写日志系统.
因此,如果一个已经编写的日志记录系统没有为您完成,您似乎真的在问"我如何编写一个根据标志值有条件地打印东西的函数?"
这是一种方式:
#!/usr/bin/env perl
package My::Logger;
{
use strict; use warnings;
use Sub::Exporter -setup => {
exports => [
DEBUG => sub {
return sub {} unless $ENV{MYDEBUG};
return sub { print 'DEBUG: ' => @_ };
},
]
};
}
package main;
use strict; use warnings;
# You'd replace this with use My::Logger qw(DEBUG) if you put My::Logger
# in My/Logger.pm somewhere in your @INC
BEGIN {
My::Logger->import('DEBUG');
}
sub nicefunc {
print "Hello World!\n";
DEBUG("Isn't this a nice function?\n");
return;
}
nicefunc();
Run Code Online (Sandbox Code Playgroud)
样品用法:
$ ./yy.pl Hello World! $ MYDEBUG=1 ./yy.pl Hello World! DEBUG: Isn't this a nice function?