我正在尝试将数组从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个长字符串,其中所有数组变量均无空格连接。
谢谢
答案 0 :(得分:5)
在外壳程序(和Perl)中,反引号(``
)捕获命令的输出。但是,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
会将它们拆分为单独的数组元素。如果您的数组中确实包含空格,那么请向提供示例数据,以便我们可以提出另一种建议,即如何将其返回到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