在Perl脚本中从数组设置shell数组

时间:2015-01-30 16:49:13

标签: bash perl shell

我有以下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]

我的方法不起作用。

3 个答案:

答案 0 :(得分:3)

您无法返回数组。这个概念毫无意义,因为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代码和shell中代码的eval

例如,

$ 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

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

$ test.pl

根本没有输出。

首先,您将整个Perl脚本放在sub中。除非你打电话给Perl,否则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中初始化数组。

相关问题