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解决方案。谢谢你的建议。