perl模块中的静态变量

perl模块中的静态变量,perl,perl-module,perl-data-structures,activeperl,Perl,Perl Module,Perl Data Structures,Activeperl,我想在一个调用模块的模块中设置一个变量,并在另一个调用模块中检索该值 我在这一行做了一些事情: 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;

我想在一个调用模块的模块中设置一个变量,并在另一个调用模块中检索该值

我在这一行做了一些事情:

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

我的实现有什么问题?

添加一些调试(例如,
警告“将数据设置为$data”;
在set\u data的末尾和
警告“获取数据:$data”;
在get\u data的开头),并验证事情是否按照您认为的顺序发生

请注意,在编译时加载模块时,模块的主代码(get_数据调用和set_数据调用都是主代码)会运行;如果您依赖于在运行时发生的其他事情来获取值,那么这将不起作用


如果所有其他方法都失败了,请尽可能多地删除您的代码,并且仍然让它失败,并向我们展示失败的情况(包括加载Mod1和Mod2的情况)。

我已经解决了问题。setter代码

package Mod1;
use Test;

Test::set_data(1);
正在线程化函数中运行。 我发现在函数中,变量的状态正在按预期发生变化,我还可以访问最新的数据


一旦退出线程函数,变量的值就不再存在。我所说的退出线程函数是指在我加入所有正在运行的线程之后。

当我不得不做类似的事情时,我通常会寻求帮助。你可以用那种方法


有关示例,请参见此答案()

Mod1和Mod2两个包是否在同一个文件下?请考虑使用其他名称作为测试是一个核心模块。不,它们是不同的文件,并有不同的文件夹结构。我让他们通过使用我在这里提到的lib访问测试模块。当我打印$data时,它会打印,但返回到Mod2时,它会给出undef。@ysth因此,当我从一个文件的set_数据设置数据并从另一个文件的get_数据访问数据时,它不会持续存在?如果您按照您认为的顺序执行,它会持续存在。但是在编译过程中运行东西很容易在顺序上出错。您也可以将
$data
放在围绕这两个函数的闭包中,这将使其成为一个有效的私有变量。线程代码可能会导致一些有趣的陷阱。数据结构的序列化和反序列化始终是一个选项。但问题在于,在文件中读取和写入内容会产生成本。我在寻找原生perl解决方案。谢谢你的建议。