Статические переменные в модуле perl

Я хочу установить переменную в модуле из одного вызывающего модуля и получить это значение в другом вызывающем модуле.

Я сделал что-то в этой строке:

package Test;

our $data = undef;

sub set_data
{
    $data = shift @_;
}

sub get_data
{
    return $data
}

Я устанавливаю данные как:

package Mod1;
use Test;

Test::set_data(1);

Я получаю данные как:

package Mod2;
use Test;

print Test::get_data();

Но я получаю undef при получении значения.

Что не так в моей реализации?


person Kallol    schedule 08.12.2014    source источник
comment
Два пакета Mod1 и Mod2 находятся в одном файле? Пожалуйста, рассмотрите возможность использования другого имени, поскольку Test является основным модулем.   -  person xtreak    schedule 08.12.2014
comment
Нет, это разные файлы и имеют разную структуру папок. Я заставил их получить доступ к тестовому модулю с помощью библиотеки, которую я немного упомянул здесь.   -  person Kallol    schedule 08.12.2014
comment
Ok. Когда я печатаю $data, он печатает, но при возврате в Mod2 выдает undef.   -  person xtreak    schedule 08.12.2014


Ответы (3)


Я понял проблему. Код сеттера

package Mod1;
use Test;

Test::set_data(1);

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

Как только я выхожу из потоковой функции, значение переменной больше не сохраняется. Что я имею в виду под функцией «из потоковой передачи», так это после того, как я присоединился ко всем запущенным потокам.

person Kallol    schedule 08.12.2014
comment
Вы также можете поместить $data в замыкание вокруг этих двух функций, что сделает его фактически частной переменной. Однако многопоточный код может привести к некоторым интересным ловушкам. - person Sobrique; 08.12.2014

Добавьте немного отладки (например, warn "setting data to $data"; в конце set_data и warn "getting data: $data"; в начале get_data) и убедитесь, что все происходит в том порядке, в котором вы думаете.

Обратите внимание, что основной код модуля (которым являются ваши вызовы get_data и set_data) запускается, когда модуль загружается во время компиляции; если вы зависите от чего-то еще, что происходит во время выполнения, чтобы получить значение, это не сработает.

Если ничего не помогает, удалите как можно большую часть своего кода, и он все равно будет сбоить, и покажите нам случай сбоя соревнования (включая все, что загружает Mod1 и Mod2).

person ysth    schedule 08.12.2014
comment
@ysth Итак, когда я устанавливаю данные из set_data одного файла и получаю к ним доступ из get_data другого файла, они не сохраняются? - person xtreak; 08.12.2014
comment
так и будет, если вы делаете это в том порядке, в котором вы думаете. но запуск вещей во время компиляции позволяет легко ошибиться в порядке. - person ysth; 08.12.2014

Когда мне нужно сделать что-то подобное, я обычно прибегаю к помощи Storable. Вы можете использовать этот метод.

См. этот ответ (https://stackoverflow.com/a/17082242/257635) в качестве примера.

person Chankey Pathak    schedule 08.12.2014
comment
Здесь всегда возможна сериализация и десериализация структуры данных. Но проблема заключается в том, что чтение и запись содержимого в файл и из него сопряжены со стоимостью. Я искал собственное решение Perl. Спасибо за ваше предложение. - person Kallol; 09.12.2014