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

问题描述 投票:2回答:1

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

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

-先谢谢你

perl ipc data-transfer
1个回答
5
投票

简而言之,你需要把数据从一个程序传回调用它的程序。

如果被调用的程序(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然后,它就会从这两个文件中重建哈希值。JSONStorable 字符串。在这两种情况下,我们都会得到一个哈希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)技术。

© www.soinside.com 2019 - 2024. All rights reserved.