Tra*_*der 2 perl data-transfer ipc
我需要一些帮助来读取在 perl 中主脚本中执行的子脚本中分配的值
%var1 %var2声明和分配了很少的哈希(),并且正在处理整个脚本中的值。system(perl sub_script.pl) %var1 %var2 %var1在 main.pl 脚本级别的sub_script.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";
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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";
}
Run Code Online (Sandbox Code Playgroud)
main.pl 的输出:
主要:: var1:结束 主:: var2: abcd 主要:: var3: efgh 主要:: var4: test1 主要::哈希值: 主要:: var1:结束 主:: var2: abcd 主要:: var3: efgh 主要:: var4: test2 主要::哈希值: 主要:: var1:结束 主:: var2: abcd 主要:: var3: efgh 主:: var4: test3 主要::哈希值:
预期输出:
主要:: var1:开始 主:: var2: abcd 主要:: var3: efgh 主要:: var4: test1 main:: 哈希值:1234 主要:: var1:开始 主:: var2: abcd 主要:: var3: efgh 主要:: var4: test2 main:: 哈希值:5679 主要:: var1:开始 主:: var2: abcd 主要:: var3: efgh 主:: var4: test3 main:: 哈希值:5555
-提前致谢
简而言之,您需要将数据从程序传递回调用它的程序。
如果被调用的程序 ( sub_script.pl) 只需要返回简单的值,那么它可以将它们打印到STDOUT,调用程序 ( main.pl) 通过“反引号”(运算符形式中的qx)运行它,返回程序的STDOUT.
然而,更复杂的数据结构需要被序列化,以便它们可以通过管道(某种)逐字节有意义地发送。有多种方法可以做到这一点,有好的库,下面的简单代码演示了其中的两种。
该JSON格式很简单,人类可读和可访问的任何语言和系统。用于在 Perl 数据结构和相应 JSON 之间转换的 Perl 库使用起来非常简单。这是适用于各种情况的良好且安全的解决方案。
Perl 的Storable是一种持久性工具,因此可以将复杂的数据结构转储到磁盘,然后再从文件中恢复。还可以将数据序列化为无需文件即可在程序之间传递的字符串。
下面的程序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;
Run Code Online (Sandbox Code Playgroud)
下面的程序(main.pl)运行sub_script.pl上面的 usingqx以便它接收它的STDOUT,然后它从JSON和Storable字符串重建散列。在这两种情况下,我们都会返回一个 hashref,一个对数据的引用,如原始哈希
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;
Run Code Online (Sandbox Code Playgroud)
为简单起见,我使用JSON,它将使用快速(JSON_XS如果已安装)或纯 Perl 回退,核心JSON_PP. 另一种选择是Cpanel::JSON::XS,它是JSON_XS.
为了打印复杂的数据结构以便轻松查看它们,我使用Data::Dump,它可能需要安装。还有许多其他很好的模块可以显示复杂的数据,使用最广泛的是核心Data::Dumper(因此无需安装)。
在所有这些中,被调用的程序仍然只是打印到它的STDOUT. 当数据交换需求变得更加复杂时,您可能需要使用一些“进程间通信”(IPC)技术。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |