【问题标题】:Set a shell array from an array in Perl script从 Perl 脚本中的数组设置 shell 数组
【发布时间】:2015-03-30 05:06:23
【问题描述】:

我有以下 Perl 脚本:

 sub {
    my $sequence="SEQUENCE1";
    my $sequence2="SEQUENCE2";
    my @Array = ($sequence, $sequence2);
    return \@Array;
 }
 -1

我想通过 bash 脚本检索数组的值

#!/bin/bash
seq=$(perl vectTEST.pl)
# retrieve the column 1 of the Array     
echo $seq[0]

我的方法不起作用。

【问题讨论】:

  • “它不起作用” 实际上对我们来说毫无意义;如果您能详细说明,也许我们可以提供更好的帮助:)
  • @ikegami 我无论如何都没有投反对票或接近投票
  • 在这种情况下,它的意思是“我不知道该怎么做”。这个答案没有什么值得关闭的。 [哎呀,重新发布意外删除的评论]

标签: bash perl shell


【解决方案1】:

你不能返回一个数组。这个概念没有意义,因为print 产生的是字节流,而不是变量。


一种解决方案是输出数组的文本表示并让 shell 解析它。

例如,

$ IFS=$'\n' array=( $(
   perl -e'
      my @array = ("a b", "c d", "e f");
      print "$_\n" for @array;
   '
) )

$ echo ${#array[@]}
3

$ echo "${array[1]}"
c d

此特定实现假定您的数组不能包含换行符。


另一种选择是打印出重新创建数组的 shell 代码和eval shell 中的代码。

例如,

$ eval "array=( $(
   perl -e'
      use String::ShellQuote qw( shell_quote );
      my @array = ("a b", "c d", "e f");
      print join " ", map shell_quote($_), @array;
   '
) )"

$ echo ${#array[@]}
3

$ echo "${array[1]}"
c d

这是一个强大的解决方案。

【讨论】:

    【解决方案2】:

    您可以这样做,但您需要更改 vectTEST.pl - 目前您有一个匿名子,您没有分配给任何东西。将 perl 脚本更改为:

    $vect = sub {
        my $sequence="SEQUENCE1";
        my $sequence2="SEQUENCE2";
        my @Array=();
        push(@Array,$sequence,$sequence2);
        return \@Array;
    };
    1;
    

    然后,您可以在 bash 中执行此操作:

    mapfile -t seq < <(perl -E 'do "vectTEST.pl"; say join "\n", @{$vect->()}')
    for idx in "${!seq[@]}"; do echo "$idx  ${seq[idx]}"; done
    
    0  SEQUENCE1
    1  SEQUENCE2
    

    【讨论】:

      【解决方案3】:

      您是否测试过您的 Perl 脚本?为了让 Perl 脚本为您提供一些可放入 shell 脚本的内容,您需要确保您的 Perl 脚本有效:

      $ test.pl
      

      根本没有输出。

      第一个问题,您将整个 Perl 脚本放在 sub 中。 Perl 中的子程序不会执行,除非您调用它们。你甚至不能这样做,因为你的子程序甚至没有名字。让我们摆脱子程序:

      my $sequence="SEQUENCE1";
      my $sequence2="SEQUENCE2";
      my @Array = ($sequence, $sequence2);
      print  \@Array . "\n";
      

      好的,现在让我们试试这个程序:

      $ test.pl   
      ARRAY(0x7f8bab8303e0)
      

      您正在打印出带有 \ 前面的 @Array 的数组引用。让我们打印出数组本身:

      my $sequence="SEQUENCE1";
      my $sequence2="SEQUENCE2";
      my @Array = ($sequence, $sequence2);
      print  @Array, "\n";
      

      现在将打印@Array:

      $ test.pl
      SEQUENCE1SEQUENCE2
      

      不完全是。每个元素之间没有空格。让我们将 输出字段分隔符$, 设置为单个空格:

      my $sequence="SEQUENCE1";
      my $sequence2="SEQUENCE2";
      my @Array = ($sequence, $sequence2);
      $,=' ';
      print @Array, "\n";
      

      现在:

      $ test.pl
      SEQUENCE1 SEQUENCE2
      

      现在,我们有一个可以工作的 Perl 程序,它可以输出我们需要放入 shell 数组的内容:

      seq=($(test.pl))
      echo ${seq[*]}
      SEQUENCE1 SEQUENCE2
      

      当您遇到问题时,您需要将其分解为多个部分。您的第一个问题是您的 Perl 脚本无法正常工作。修复后,您现在可以使用它在 Bash shell 中初始化您的数组。

      【讨论】:

      • 注意:如果序列中有空格,那将失败。
      • 使用$, 有什么用? print join ' ', @Array, "\n"; 会更好,虽然你可以在这里简单地使用print "@Array\n";
      • 谢谢大家,我会在星期一测试你的建议 :)
      猜你喜欢
      • 2012-01-22
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2019-02-28
      • 2011-09-26
      • 2010-10-15
      相关资源
      最近更新 更多