从perl返回数组到bash

时间:2018-07-30 07:33:15

标签: bash perl

我正在尝试将数组从perl还原到bash。

我的perl脚本有一个数组,然后我使用Error: File to import not found or unreadable: compiled/svg Parent style sheet: C:/Users/....../xyz.scss [exec] >> @import "compiled/svg";

我使用的bash脚本

return(@arr)

当我回显VAR时 我得到aray为1个长字符串,其中所有数组变量均无空格连接。

谢谢

2 个答案:

答案 0 :(得分:5)

在外壳程序(和Per​​l)中,反引号(``)捕获命令的输出。但是,Perl的return通常用于从子例程返回变量-它不会产生输出,因此您可能希望使用print。另外,在bash中,array variables用括号声明。所以这对我有用:

$ ARRAY=(`perl -wMstrict -le 'my @array = qw/foo bar baz/; print "@array"'`); \
    echo "<${ARRAY[*]}> 0=${ARRAY[0]} 1=${ARRAY[1]} 2=${ARRAY[2]}"
<foo bar baz> 0=foo 1=bar 2=baz

在Perl中,将数组内插到字符串中(例如"@array")将使数组与元素之间的特殊变量$"结合在一起;该变量默认为单个空格。如果仅使用print @array,则数组元素将由变量$,连接,变量MCVE默认为undef,这意味着元素之间没有空格。这可能解释了您提到的行为(“无空间连接的数组变量” )。

请注意,如果数组的元素包含空格,以上内容将不能起作用,因为bash会将它们拆分为单独的数组元素。如果您的数组中确实包含空格,那么请向enter image description here提供示例数据,以便我们可以提出另一种建议,即如何将其返回到bash。例如:

( # subshell so IFS is only affected locally
    IFS=$'\n'
    ARRAY=(`perl -wMstrict -e 'my @array = ("foo","bar","quz baz"); print join "\n", @array'`)
    echo "0=<${ARRAY[0]}> 1=<${ARRAY[1]}> 2=<${ARRAY[2]}>"
)

输出:0=<foo> 1=<bar> 2=<quz baz>

答案 1 :(得分:1)

这是使用Bash word splitting的一种方法,它将把空白处的字符串分割成新的数组array

array_str=$(perl -E '@a = 1..5; say "@a"')
array=( $array_str )

for item in ${array[@]} ; do
    echo ": $item"
done

输出

: 1
: 2
: 3
: 4
: 5