2016-05-12 4 views
1

Я хотел бы использовать переменную Perl из моего скрипта в файле конфигурации Log :: Log4perl. Я прочитал документацию и обнаружил, что могу использовать подпрограмму, но я хотел бы сделать это немного проще, если это возможно.Как я могу использовать переменную Perl в моем файле конфигурации Log :: Log4perl?

Я хочу, чтобы установить имя файла для моего 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"; } 

Есть ли способ получить результат переменной без sub внутри моего скрипта?

+0

Вы сказали, что '$ av_std_LOGFILE' установлен в скрипте пару раз и модуль пару раз. Что он? – ThisSuitIsBlackNot

+0

Кроме того, вы не должны вызывать подпрограммы с '&', если вы не знаете, что это делает. 'return & av_getLogfileName();' должно быть 'return av_getLogfileName();' (или, еще лучше, 'return av_get_logfile_name();', смешивание змеиного футляра и верблюжьего футляра действительно трудно читать, а случай с змеем обычно предпочтительнее в Perl). – 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

спасибо; Я получаю сообщения об ошибках: Не удается открыть (Datei oder Verzeichnis nicht gefunden) на /home/fx42252/perl5/lib/perl5/Log/Log4perl/Appender/File.pm строке 124. at/home/fx42252/perl5/lib /perl5/Log/Log4perl/Appender/File.pm строка 129. – averlon

+0

Либо вы не устанавливаете '$ av_std_LOGFILE' в пакет' main', либо вы устанавливаете его после вызова 'Log :: Log4perl :: init' , Если вы устанавливаете переменную внутри модуля, вам нужно использовать имя пакета модуля, например.если ваш код модуля «package Foo :: Bar; наш $ av_std_LOGFILE = '/ foo'; 'тогда ваш крючок будет' sub {return $ Foo :: Bar :: av_std_LOGFILE; } ' – ThisSuitIsBlackNot

+0

позволяет пропустить выражение« модуль ». Я использую perl до сих пор, чтобы заменить скрипт bash. Таким образом, не существует такой структуры, как пакет, модуль, ..... То, что я понял до сих пор, с помощью perl таким образом, это все «main ::». Не уверен. Во всяком случае: вы можете быть уверены, что переменная установлена ​​в момент, когда используется init. – averlon

 Смежные вопросы

  • Нет связанных вопросов^_^