0

我有一个应用程序,其中将运行需要能够访问存储数据的脚本。我想运行一个脚本(main.pl)来创建一个数组。稍后,如果我运行A.plor B.pl,我希望这些脚本能够访问先前创建的数组并更改其中的值。我需要编写什么代码main.pl A.pl B.pl才能实现这一目标?

4

2 回答 2

3

通常一个 perl 实例不能访问另一个实例的变量。那么问题就变成了“一个人能做什么几乎就像共享变量一样”?

一种方法是将数据存储在可以持久保存的位置,例如数据库或磁盘上的 CSV 文件。这意味着在程序开始时读取数据,然后编写或更新数据,自然会引发有关竞争条件、锁定等的问题……并大大扩展了任何可能的答案需要涵盖的范围。

另一种方法是编写程序以使用 CSV 或 YAML 或其他一些易于由 CPAN 库读取和写入的格式,并使用 STDIN 和 STDOUT 进行输入和输出。这允许存储解耦,并且还可以将多个工具与来自 shell 提示的管道链接在一起。

对于将哈希绑定到共享内存的内存解决方案,您可以查看 IPC::Shareable

http://metacpan.org/pod/IPC::Shareable

于 2013-06-25T09:55:55.690 回答
1

Perl 内存结构不能被存储然后被其他 Perl 脚本访问。但是,您可以将这些内存结构写成文件。这可以通过硬编码或使用各种 Perl 模块来完成。Storable是一个标准的Perl 模块,并且已经存在了很长一段时间。

由于您要安装的只是一个数组,因此您可以让一个程序将数组写入文件,然后让另一个文件读取数组。

use strict;
use warnings;
use autodie;
use constant {
    ARRAY_FILE => "$Env{HOME}/perl_arry.txt",
};

my @array;
[...]    #Build the array
open my $output_fh, ">", ARRAY_FILE;
while my $item ( @array ) {
    say {$output_fh} $item;
}
close $output_fh;

现在,让你的第二个程序读入这个数组:

use strict;
use warnings;
use autodie;
use constant {
    ARRAY_FILE => "$Env{HOME}/perl_arry.txt",
};

my @new_array;
open my $input_fh, "<", ARRAY_FILE;
while ( my $item = <$input_fh> ) {
    push @new_array, $item;
}
close $input_fh;

可以使用 存储更复杂Storable的数据,但这几乎是同一件事:您需要将 Storable 写入物理文件,然后重新打开该文件以再次提取数据。

于 2013-06-25T16:11:30.643 回答