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

How to read values assigned inside a script, in a program that runs that script?

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

  1. 我有 "main.pl",其中我几乎没有声明和分配哈希值 (%var1 %var2),并且正在处理整个脚本中的值。
  2. 在 main.pl 中,我使用 system(perl sub_script.pl)
  3. 执行一个 perl 脚本 "sub_scirpt.pl"
  4. 在 sub.pl 中,如果我为 %var1 %var2
  5. 分配很少的值
  6. 如何在 main.pl 脚本级别打印在 %var1 的 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";
}

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: 1234
main:: var1: start 
main:: var2: abcd  
main:: var3: efgh 
main:: var4: test2   
main:: hash-value: 5679
main:: var1: start 
main:: var2: abcd  
main:: var3: efgh 
main:: var4: test3   
main:: hash-value: 5555

-提前致谢

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

如果被调用程序 (sub_script.pl) 只需要 return 简单值,那么它可以将它们打印到 STDOUT,调用程序 (main.pl)通过 "backticks"(运算符形式的 qx)运行它,return 是程序的 STDOUT

但是,需要 serialized 更复杂的数据结构,以便它们可以有意义地逐字节发送到(某种类型的)管道。有多种方法可以做到这一点,有很好的库,下面的简单代码演示了其中的两个。

JSON format 非常简单,人类可读,并且可以从任何语言和系统访问。用于 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;

下面的程序 (main.pl) 使用 qx 运行上面的 sub_script.pl 以便它接收它的 STDOUT,然后它从 JSONStorable 字符串重建散列。在这两种情况下,我们都会得到一个 hashref,一个对数据的引用,比如原始 hash

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 for simplicity, which will use the fast JSON_XS if installed, or the pure-Perl fallback, the core JSON_PP. Another option is Cpanel::JSON::XSJSON_XS 的一个分支。

要打印复杂的数据结构以便于查看它们,我使用 Data::Dump, which probably need be installed. There is a number of other good modules to show complex data, the most widely used one being the core Data::Dumper(因此无需安装)。


在所有这一切中,被调用的程序仍然只是打印到它的 STDOUT。当数据交换需求变得更加复杂时,您可能需要使用一些 "Inter-Process-Communication" (IPC) 技术。