繁体   English   中英

将Perl数组传递给bash脚本

[英]Pass Perl array to bash script

我正在尝试使用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中进行设置,因此我需要帮助。

简短的答案是-您不能在程序之间传递数据结构。

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

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

use JSON;
print to_json(\@result_list); 

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

或者只是知道,请在perl完成所有工作。 没什么不同。

通常,在这种情况下,我可能会选择“在X上完成所有工作”,其中X比shell先进得多,但我不得不这样做一两次。 主要是因为我正在建立一个交互式外壳环境。

我最后要做的是与ssh-agent -s类的工具一样的事情:构建将导致根据需要设置环境的shell命令,然后让父shell评估它们,例如:

eval $(perl perl_script.pl)

只要注意确保每个单独的命令被分隔; 因为\\n通常是被压缩的。

另一个替代方法是,将其输出到新文件,并允许父批处理文件call它(或者在shell中,它是source ,我不太喜欢它,但是在为Windows的批处理文件生成变量时使用了该方法。它)。 如果可以避免使用临时文件,我不太喜欢使用临时文件,尽管这样可以使调试工作更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM