Perl - myprint()或重载打印命令的新定义

Kin*_*Jnr -2 printing perl

我是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()功能吗?

Sin*_*nür 5

您是否更关心编写自己的日志记录系统,或者您是否想知道如何将日志记录语句放在程序的相应部分中,以便关闭它们(并且在关闭时会产生很少的性能损失)?

如果您想要一个易于开始使用的日志记录系统,而且还提供了一个可以逐步发现和使用的功能,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?

  • Sinan没有说的是Log4perl允许你在程序中编写日志语句,然后在配置中决定这些日志语句是否做任何事情.我在_Mastering Perl_中有一章. (2认同)