如何在运行该脚本的程序中读取脚本内分配的值?

Tra*_*der 2 perl data-transfer ipc

我需要一些帮助来读取在 perl 中主脚本中执行的子脚本中分配的值

  1. 我有“main.pl”,我在其中%var1 %var2声明和分配了很少的哈希(),并且正在处理整个脚本中的值。
  2. 在 main.pl 中,我执行一个 perl 脚本“sub_scipt.pl”,使用 system(perl sub_script.pl)
  3. 在 sub.pl 中,如果我给 %var1 %var2
  4. 如何打印%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

-提前致谢

zdi*_*dim 5

简而言之,您需要将数据从程序传递回调用它的程序。

如果被调用的程序 ( 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,然后它从JSONStorable字符串重建散列。在这两种情况下,我们都会返回一个 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)技术。