将Perl数组传递给bash脚本

时间:2017-05-22 14:48:30

标签: arrays bash perl soap

我正在尝试使用Perl脚本连接到Footprints API。我正在使用Perl,因为它是Footprints API将使用的少数几种语言之一。

我希望这个Perl脚本从Footprints收集数据,将数据放在一个数组中,然后将该数组传递回调用它的shell脚本。

如何将数组从Perl脚本传递给bash脚本?

以下是连接Footprints API并收集数据的模板。

模板:

use strict;

use SOAP::Lite;

my $USE_PROXY_SERVER = 1;

my $soap = new SOAP::Lite;

$soap->uri( 'http://fakeserver.phoneycompany.com/MRWebServices' );

if ( $USE_PROXY_SERVER ) {
    $soap->proxy(
        'http://fakeserver.phoneycompany.com/MRcgi/MRWebServices.pl',
        proxy => ['http' => 'http://localhost:8888/'] );
}
else {
    $soap->proxy( 'http://fakeserver.phoneycompany.com/MRcgi/MRWebServices.pl' );
}

my $soapenv = $soap->MRWebServices__search(
    'WebServices',
    'fakepassword',
    '',
    "select mrID, mrTITLE from MASTER78 WHERE mrTITLE LIKE '%of%'"
);

my $result;

if ( $soapenv->fault ) {
    print ${$soapenv->fault}{faultstring} . "\n";
    exit;
}
else {
    $result = $soapenv->result;
}

my @result_list = @{$result};

for ( my $i = 0; $i <= $#result_list; $i++ ) {

    print "RESULT $i\n";

    my $hash_ref = $result_list[$i]; 

    foreach my $item ( keys %{$hash_ref} ) {
        my $val = $hash_ref->{$item};
        print "$item = '$val'\n";
    }

    print "---------------------\n";
}

在模板中,我认为只是将键/值对打印到stdout。

我是Perl的新手,我只是用它来搜索Footprints API。我不确定你是否能以某种方式使用bash脚本从stdout捕获数据,或者如果我必须做一个数组或数组的字符串表示并返回它。

在我的bash脚本中,我打算将Perl脚本的结果分配给VAR=(perl perl_script.pl)之类的变量。但我不知道如何为数组做到这一点,这就是为什么我在考虑数组的字符串表示,将其分配给变量并在之后用bash解析它。

我不知道如何在Perl中设置它,所以我需要帮助。

2 个答案:

答案 0 :(得分:2)

简短回答是 - 您无法在程序之间传递数据结构。

你可以传递文字(和二进制内容,但我建议你不要在这里这样做)。

最简单的方法之一是使用现有的数据交换格式,如JSON:

use JSON;
print to_json(\@result_list); 

然后手动解码你的bash脚本中的JSON表单

或者只是你知道,在perl做所有的工作。它并没有那么不同。

答案 1 :(得分:0)

虽然,一般情况下,也许在这种特殊情况下,我会选择“在X中做全部”,其中X是比shell更先进的东西,我必须做一次或两次。主要是因为我正在建立一个交互式shell环境。

我最终做的是像ssh-agent -s这样的工具做同样的事情:构建将导致环境按需设置的shell命令,然后让父shell评估它们,例如:

eval $(perl perl_script.pl)

请注意确保每个单独的命令由;分隔,因为\n被(通常)压扁。

另一种我更喜欢的替代方案,但我在为Windows批处理文件生成变量时使用的是将其输出到新文件并允许父批处理文件call (或者,在shell中,source)。如果我可以避免它们,我不是临时文件的忠实粉丝,虽然它可以使调试更容易。