0

我有以下场景 - > 3个文件

  1. 模块.pl
  2. a.pl
  3. b.pl

-------------------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 中吗?

4

1 回答 1

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') };
于 2013-10-02T17:04:38.550 回答