Perl:处理多个脚本中的全局变量

时间:2013-10-02 16:31:44

标签: perl global

我有以下情况 - > 3个文件

  1. module.pl
  2. a.pl
  3. b.pl
  4. ------------------- 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?

1 个答案:

答案 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') };