2011-09-15 4 views
1

Я уверен, что моя проблема связана с пространствами имен и областью определения, но мне нужна помощь!Переменная/Постоянная в UNIVERSAL?

Я пишу сценарий Perl OO с довольно большим количеством классов и требования к минимизации внешнего использования модуля (не спрашивайте ... Я знаю, я знаю ...)

Итак, Я хочу использовать UNIVERSAL, чтобы предложить метод ведения журнала, который может использовать каждый объект.

Вот очень простой пример, который я только что взломал.

Проблема заключается в $error_log переменной в пространстве имен UNIVERSAL не кажется, чтобы быть доступными объектами в других классах таким же образом, что методы поголовно.

Ошибки с my $error_log: Использование неинициализированного значение $ FilePath в открытых на ./test_uni.pl линии 47. Использование неинициализированного значение $ FilePath в конкатенации или строки в ./test_uni.pl строке 47. (.) Невозможно написать: Нет такого файла или каталога на ./test_uni.pl строке 47.

На самом деле, теперь я набираю это, я задаюсь вопросом, будет ли работать закрытие с помощью метода класса в UNIVERSAL.

В то время как я иду и пытаюсь это сделать, есть ли у кого-нибудь предложения для меня, пожалуйста?

Спасибо!

==================== UPDATE ======================

Затвор с помощью метода класса в универсальном, казалось, работали:

package UNIVERSAL; 
use POSIX qw(strftime); 
use Sys::Hostname; 

{ 
    sub ERROR_LOG { 
    return hostname() . "-" . strftime("%Y-%m-%d_%H.%M", localtime) . ".log"; 
    } 
} 

И тогда я называю его в UNIVERSAL::_logger с UNIVERSAL->ERROR_LOG.

НО! Я хочу, чтобы путь к файлу ERROR_LOG был создан один раз во время выполнения. При этом он будет оценивать его каждый раз ...

Это единственный способ? Как я могу получить доступ к переменным в пакете UNIVERSAL из других источников?

Спасибо!

ответ

1

Проблема в вашем случае заключается только в том, что вы запускаете код до того, как настроено содержимое в UNIVERSAL.

Переместите основной пакет до упора вниз или заверните UNIVERSAL в блок BEGIN, и он будет работать.

Ничего странного в отношении UNIVERSAL или моего движения здесь.


Update: Хорошо, это немного странно, что вы можете назвать _logger (так что часть загружается уже), но $ error_log пока не существует.Вот минимальный пример, который демонстрирует такое поведение (удалить НАЧАТЬ блок, чтобы увидеть проблему):

use strict; 
use warnings; 

ABC->hey(); 

package ABC; 
BEGIN{ 
    my $x = 1; 
    sub hey(){ 
    print "x = $x"; 
    } 
} 

Может this объясняет:

Моих имеет как время компиляции и RUN- временного эффекта. Во время компиляции компилятор замечает это. Основная полезность этого заключается в том, чтобы тихо использовать строгие «вары», но это также необходимо для создания закрытий, как описано в perlref. Фактическая инициализация задерживается до времени выполнения, тем не менее, поэтому она запускается в соответствующее время, например, каждый раз через цикл, например.

Мое чтение будет то, что объявление переменной и подпрограммы составляются до код выполняется, но присвоение значения не занимает место до линии, которая делает это снова достигается (в вашем случае после того, как вы вызываете подпрограммы, которые являются замыканиями вокруг все еще неинициализированного значения).

+0

Спасибо за это! Я думал, что место в файле не имеет значения ... Я проверю это. – wawawawa

+0

Yup. Оно работает. Благодаря! – wawawawa