【问题标题】:Perl: dealing with global variables in multiple scriptsPerl:在多个脚本中处理全局变量
【发布时间】:2013-10-02 16:31:43
【问题描述】:

我有以下场景 -> 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--------

p>
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 个?
  • 这给出了“Can't locate object method "Package" via package "Foo" [...]”,而不是您描述的行为。您发布的内容和运行的内容之间还有其他区别吗?
  • 注意文件名和包名要匹配。

标签: perl global


【解决方案1】:

您正在混淆源代码(要执行的文本)和文本在执行时创建的数据结构。

执行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') };

【讨论】:

  • 这肯定会有所帮助。感谢您的澄清!我得到了我的答案。非常感谢
猜你喜欢
  • 1970-01-01
  • 2021-07-22
  • 2023-03-15
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2022-01-21
相关资源
最近更新 更多