1

我想在 Log::Log4perl 配置文件中使用我的脚本中的 Perl 变量。我阅读了文档,发现我可以使用子例程,但如果可能的话,我想做得更简单一些。

我想为我的附加程序设置文件名:

log4perl.appender.av_std_LOGFILE.filename="whateverfilename.log"

但是这样做,它是一个固定值。

我在脚本中的变量中有文件名,并希望在运行时使用它:

log4perl.appender.av_std_LOGFILE.filename=\
 sub { return &av_getLogfileName(); }

这是子程序:

sub av_getLogfileName
{
    return $av_std_LOGFILE;
}

这可行,但我想避免在我的脚本中使用 sub,因为返回值非常简单。

文档说:

以字符串开头的每个值sub {...都被解释为在应用程序解析配置时要执行的 Perl 代码......

所以我尝试了这样的事情,但没有奏效:

log4perl.appender.av_std_LOGFILE.filename=\
    sub { print "$av_std_LOGFILE"; }

有没有办法在我的脚本中没有 sub 的情况下获得变量的结果?

4

1 回答 1

4

print成功返回 1,所以

sub { print "$av_std_LOGFILE"; }

返回 1,而不是 的值$av_std_LOGFILE。您还必须完全限定 hooks 中的变量名称,这意味着您必须使$av_std_LOGFILE包全局化。

将您的钩子更改为:

sub { return $main::av_std_LOGFILE; } # double quotes are unnecessary

$av_std_LOGFILE像这样在你的脚本中设置(在调用之前Log::Log4perl::init):

our $av_std_LOGFILE = '/path/to/logfile';

一般来说,你应该避免使用全局变量,所以我更喜欢使用子程序。

于 2016-05-12T15:05:00.560 回答