2016-05-12 54 views
1

我想在我的腳本中使用Log :: Log4perl配置文件中的Perl變量。我閱讀了文檔,發現我可以使用一個子程序,但如果可能的話,我希望它能做得更簡單一些。如何在我的Log :: Log4perl配置文件中使用Perl變量?

我想設置的文件名我的appender:

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,因爲返回值非常簡單。

documentation說:

開始用字符串sub {...被解釋爲在應用解析配置的時間執行Perl代碼的每個值...

所以,我想的東西像這樣,但它沒有工作:

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

有沒有辦法獲得變量的結果沒有我的腳本內的子?

+0

你說'$ av_std_LOGFILE'設置在一個腳本幾次和一個模塊幾次。這是什麼? – ThisSuitIsBlackNot

+0

另外,你不應該用'&'調用子程序,除非你知道那是做什麼的。 ''return&av_getLogfileName();''應該返回av_getLogfileName();(或者更好的是,返回av_get_logfile_name();',混合snake case和camel case確實很難閱讀,並且在Perl中一般首選snake case)。 – ThisSuitIsBlackNot

回答

4

print返回1成功,所以

sub { print "$av_std_LOGFILE"; } 

回報1 $av_std_LOGFILE沒有價值。您還必須fully qualify variable names in 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'; 

一般來說,你應該避免全局變量,所以我寧願使用一個子程序。

+0

謝謝;我收到錯誤消息:無法在/home/fx42252/perl5/lib/perl5/Log/Log4perl/Appender/File.pm 124行打開(Datei oder Verzeichnis nicht gefunden)。/ home/fx42252/perl5/lib中的 /perl5/Log/Log4perl/Appender/File.pm line 129. – averlon

+0

要麼你沒有在'main'包中設置'$ av_std_LOGFILE',要麼在你調用Log :: Log4perl :: init之後設置它。 。如果您在模塊內設置變量,則需要使用模塊的包名稱,例如如果你的模塊代碼是'package Foo :: Bar;我們的$ av_std_LOGFILE ='/ foo';'那麼你的鉤子就是'sub {return $ Foo :: Bar :: av_std_LOGFILE; }' – ThisSuitIsBlackNot

+0

可以跳過表達式「module」。我使用perl來替換bash腳本。所以沒有像包,模塊這樣的結構,.....我到目前爲止所理解的是,通過使用perl這種方式,它全部是「main ::」。不確定。總之:你可以確定變量是在init使用的時候設置的。 – averlon

相關問題