【发布时间】:2010-04-14 07:57:25
【问题描述】:
我有一组日志记录和调试功能,我想在多个模块/对象中使用它们。我希望能够使用命令行开关全局打开/关闭它们。
以下代码执行此操作,但是,我希望能够省略包名并将所有内容保存在一个文件中。
更具体地说,我想将日志记录函数名称导入每个模块,以便可以在没有任何包名称限定的情况下调用它们(类似于 C++ use namespace; 指令)并且我希望能够启用/ 从使用它们的脚本中全局禁用它们,如下面的示例代码所示。
另一件事 - 我不认为我完全理解为什么下面的代码有效。
#! /usr/bin/perl -w
use strict;
use Getopt::Long;
{
package LogFuncs;
use threads;
use Time::HiRes qw( gettimeofday );
# provide tcpdump style time stamp
sub _gf_time {
my ( $seconds, $microseconds ) = gettimeofday();
my @time = localtime($seconds);
return sprintf( "%02d:%02d:%02d.%06ld",
$time[2], $time[1], $time[0], $microseconds );
}
sub logerr;
sub compile {
my %params = @_;
*logerr = $params{do_logging}
? sub {
my $msg = shift;
warn _gf_time() . " Thread " . threads->tid() . ": $msg\n";
}
: sub { };
}
}
{
package FooObj;
sub new {
my $class = shift;
bless {}, $class;
};
sub foo_work {
my $self = shift;
# do some foo work
LogFuncs::logerr($self);
}
}
{
package BarObj;
sub new {
my $class = shift;
my $data = { fooObj => FooObj->new() };
bless $data, $class;
}
sub bar_work {
my $self = shift;
$self->{fooObj}->foo_work();
LogFuncs::logerr($self);
}
}
my $do_logging = 0;
GetOptions(
"do_logging" => \$do_logging,
);
LogFuncs::compile(do_logging => $do_logging);
my $bar = BarObj->new();
LogFuncs::logerr("Created $bar");
$bar->bar_work();
【问题讨论】:
标签: perl