我有以下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]
我的方法不起作用。
答案 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中初始化数组。