我有以下情况 - > 3个文件
------------------- Module.pm ------------------
use strict;
use warnings;
Package Foo;
our %hash = ( NAME => "NONE" , SSN => "NONE");
---------------------- a.pl -------------------
use strict;
use warnings;
use Module;
my $name = "Bill"
my $SSN = "123456789";
# update name and SSN
$Foo::hash{NAME} = $name;
$Foo::hash{SSN} = $SSN;
---------------------- b.pl --------------------
use strict;
use warnings;
use Module;
## print the updated values of name and SSN
print "\nUpdated values -> NAME = $Foo::hash{'NAME'} SSN = $Foo::hash{SSN}";
我先执行a.pl,然后执行b.pl. 但是a.pl给出了更新的输出,但是b.pl仍为这两个字段提供了旧的“NONE”输出。 我甚至试图打印两个地址都有a.pl和b.pl中的值,它们是不同的。
任何想法如何访问a.pl中更新的值到b.pl?
答案 0 :(得分:2)
您正在混淆源代码(要执行的文本)和文本在执行时创建的数据结构。
执行Module.pm
(例如通过加载)会在当前进程中创建哈希。 (当前解释器更具体。)a.pl
更改了哈希。
b.pl
不会访问该进程或解释器中的任何内容,这些内容甚至都不可能存在。 b.pl
执行Module.pm
中的代码,甚至没有尝试更改该文件。
如果要将数据从一个进程传输到另一个进程,则必须将其存储在可以访问的位置。 (磁盘,数据库,管道,共享内存等)
# To store
use Storable qw( lock_nstore );
lock_nstore(\%Foo::hash, 'file');
# To recover
use Storable qw( lock_retrieve );
%Foo::hash = %{ lock_retrieve('file') };