Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Переопределение переменной из плагина


Автор: vgray 7.2.2008, 14:34
добрый день,

есть программа к которой могут подгружаться различные языковые модули
с помощью след кода 
Код

sub lang {
  my $lang = shift;

  eval "require Programm::Lang::$lang";

  ...

}



языковой модуль выглядит след образом

Код

package Programm::Lang::RU;

our $_LANG_DATA;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw($_LANG_DATA);

$_LANG_DATA = 'бла бла';

1;



не могу сообразить как сделть так чтобы в функции main::lang()
я эту переменную увидел
если делаю так 

Код


        require Programm::Lang::RU;
        $data =  $NC::Lang::RU::_LANG_DATA;
                return $data;



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

Код


               eval "require NC::Lang::$lang";
               $data = ?????


подскажите что делать?

Автор: ginnie 7.2.2008, 14:41
Уважаемый vgray, а в main::lang() переменную $_LANG_DATA не видно, она же экспортируется?

Автор: vadiml 7.2.2008, 15:08
Вы таки разберитесь чему Вы присваиваете данные:
Экспортируете Вы
Код

@EXPORT = qw($_LANG_DATA);

а ниже пишете:
Код

$data =  $NC::Lang::RU::_LANG_DATA;


зачем? если Вы экспортировали переменную, то и пользуйтесь ею напрямую: return $_LANG_DATA, 
только require надо заменить на use или самому вызвать функцию импорта.

а вообще я не понимаю зачем тут 'eval'

ЗЫ все же, если очень надо с eval, то надо $data = eval '....'
eval -- это почти {...}

Автор: ginnie 7.2.2008, 15:28
vgray, попробуйте по наводке vadiml написать

Код

eval "use Programm::Lang::$lang";
$data = $_LANG_DATA;



vadiml, eval нужет т.к. use и require требуют имени модуля в виде bareword.

Автор: vgray 7.2.2008, 16:39
) вы меня не так поняли, eval мне нужен что динамически подгружать модуль, а написать 

Код

eval "use Programm::Lang::$lang";
$data = $_LANG_DATA;


я не могу, так как в модуле main нет $_LANG_DATA и при use strict появится ошибка компиляции

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

Код

package Programm::Lang::RU;
our $_LANG_DATA;
use strict;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw($_LANG_DATA);
$_LANG_DATA = 'Русский';
1;

package Programm::Lang::EN;
our $_LANG_DATA;
use strict;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw($_LANG_DATA);
$_LANG_DATA = 'Английский';
1;



вот код главного модуля

Код

use strict;

sub lang {
  my $lang = shift;
  my $data;

  // Здесь нужно подключить модуль и присвоить $data значение переменной $_LANG_DATA
  // Не могу сообразить как это сделать

    return $data;

}


print lang('RU');



Автор: ginnie 7.2.2008, 17:03
vgray, попробуй

Код

our $_LANG_DATA;

eval "use Programm::Lang::$lang";
$data = $_LANG_DATA;

Автор: vadiml 7.2.2008, 19:09
vgray, 

А скажите, пожалуйста, для чего тогда у Вас 
Код

require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw($_LANG_DATA);


Добавлено через 2 минуты и 5 секунд
PS вообще-то надо писать
Код

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw($_LANG_DATA);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)