我需要一些帮助来读取在主脚本中执行的子脚本中分配的值。
%var1
%var2
)声明和分配,并在整个脚本中处理这些值。system(perl sub_script.pl)
%var1
%var2
%var1
在main.pl脚本层?希望上面的描述能给我的需求带来一些启示。
sub_script.pl的内容
our %var1 ;
our $var1 = "start";
our $var2 = "abcd";
our $var3 = "efgh";
our @var4 = qw{test1 test2 test3};
$var1{$var2}{$var3}->{test1} = "1234";
$var1{$var2}{$var3}->{test2} = "5679";
$var1{$var2}{$var3}->{test3} = "5555";
foreach $var (@var4) {
print "sub_script:: var1: $var1 \nsub_script:: var2: $var2 \nsub_script:: var3: $var3 \nsub_script:: var4: $var \nsub_script:: hash-value: $var1{$var2}{$var3}->{$var}\n";
}
sub_script.pl的输出。
sub_script:: var1: start
sub_script:: var2: abcd
sub_script:: var3: efgh
sub_script:: var4: test1
sub_script:: hash-value: 1234
sub_script:: var1: start
sub_script:: var2: abcd
sub_script:: var3: efgh
sub_script:: var4: test2
sub_script:: hash-value: 5679
sub_script:: var1: start
sub_script:: var2: abcd
sub_script:: var3: efgh
sub_script:: var4: test3
sub_script:: hash-value: 5555
main.pl的内容
@var1 = qw{start end};
$var1 = @var1[1];
our $var2 = "abcd";
our $var3 = "efgh";
@var4 = qw{test1 test2 test3};
system ("perl sub_script.pl");
print "\n\n";
foreach $var (@var4) {
print "main:: var1: $var1 \nmain:: var2: $var2 \nmain:: var3: $var3 \nmain:: var4: $var \nmain::hash-value:$var1{$var2}{$var3}->{$var}\n";
}
main.pl的输出。
main:: var1: end main:: var2: abcd main:: var3: efgh main:: var4: test1 main:: hash-value:main:: var1: end main:: var2: abcd main:: var3: efgh main:: var4: test2 main:: hash-value:main:: var1: end main:: var2: abcd main:: var3: efgh main:: var4: test3 main:: hash-value:
打算输出。
main::var1: start main::var2: abcd main::var3: efgh main::var4: test1 main::hash-value: 1234main::var1: start main::var2: abcd main::var3: efgh main:: var4: test2 main:: hash-value: 5679main:: var1: start main:: var2: abcd main:: var3: efgh main:: var4: test3 main:: hash-value: 5555。
-先谢谢你
简而言之,你需要把数据从一个程序传回调用它的程序。
如果被调用的程序(sub_script.pl
)只需要返回简单的值,那么它可以直接将它们打印到 STDOUT
,其中调用程序(main.pl
)通过 "回拨"(qx 的运算符形式),它返回程序的 STDOUT
.
然而,更复杂的数据结构需要 序列化 以便它们能够被有意义地通过一个管道(某种形式)逐字节发送。 有多种方法可以做到这一点,只要有好的库,下面的简单代码演示了其中的两种。
下面是一个简单的代码,演示了其中的两种方法。JSON格式 是非常简单的,人类可读的,并且可以从任何语言和系统中访问。用于Perl数据结构和相应JSON之间转换的Perl库使用起来非常简单。 这是一个很好的、安全的解决方案,适用于各种情况。
Perl的 储存式 是一个持久化的工具,这样复杂的数据结构可以转储到磁盘上,以后再从文件中恢复。还可以将数据序列化为字符串,可以在程序之间传递,不需要文件。
程序 sub_script.pl 下面创建了一个哈希值,并制作了一个 JSON
字符串出来并打印出来,然后还将哈希序列化为一个 Storable
字符串,它也打印出
use warnings;
use strict;
use feature 'say';
use JSON;
use Storable qw(nfreeze);
my %h = (a => { A => 1}, b => { B => 2 });
my $str_json = encode_json \%h;
say $str_json;
my $str_st = nfreeze \%h;
say $str_st;
以下程序()运行)运行 sub_script.pl
上面用 qx
以致于它的 STDOUT
然后,它就会从这两个文件中重建哈希值。JSON
和 Storable
字符串。在这两种情况下,我们都会得到一个哈希ref,一个像原始哈希一样的数据引用。
use warnings;
use strict;
use feature 'say';
use JSON;
use Storable qw(thaw);
use Data::Dump qw(dd);
my @ret = qx( sub_script.pl );
chomp @ret;
my $hr1 = decode_json $ret[0];
dd $hr1;
my $hr2 = thaw $ret[1];
dd $hr2;
我用的是 JSON 为简单起见,它将使用快速 JSON_XS
如果安装了,或者是纯Perl的后备方案,核心的 JSON_PP
. 另一种选择是 Cpanel::JSON::XS)的分支。的一个分支 JSON_XS
.
为了打印复杂的数据结构,所以我使用了 Data::Dump,可能需要安装这个模块。有许多其他的好模块来显示复杂的数据,最广泛使用的是核心的 Data::Dumper 所以不需要安装)。
在这一切中,被调用的程序仍然只是打印到它的 STDOUT
. 当数据交换需求变得更加复杂时,你可能需要使用一些 "进程间通信"(IPC)技术。