代码之家  ›  专栏  ›  技术社区  ›  H.Epstein

将数组从perl返回到bash

  •  1
  • H.Epstein  · 技术社区  · 6 年前

    我正在尝试从Perl返回一个数组以进行bash。

    我的Perl脚本有一个数组,然后我使用 return(@arr)

    从我的bash脚本我使用

    VAR = `perl....
    

    当我回响VAR 我得到的Aray为1个长字符串,所有数组变量都连接在一起,没有空格。

    谢谢

    2 回复  |  直到 6 年前
        1
  •  5
  •   haukex    6 年前

    在shell(和perl中)中,backticks( ``.&code>)捕获命令的输出。但是,perl的 return >a>is normally for returning variables from subroutines-it does not product output,so you maybly want print >a>此外,在 bash , array variables 中用括号声明。所以这对我有效:

    \
    echo“<$数组[*]>0=$数组[0]1=$数组[1]2=$数组[2]”
    <foo bar baz>0=foo 1=bar 2=baz
    < /代码> 
    
    

    在Perl中,将数组插入字符串(如“@array”)将使用特殊变量加入数组$“in between elements;that variable defaults to a single space.如果您只是print@array,那么数组元素将由变量>,>,,which isundefby default,meansion no space between the elements.这可能解释了您提到的行为(“The array vars connected with no spaces”)。

    请注意,如果数组的元素包含空白,上面的内容将按预期的方式工作,因为bashwill split them into separate array elements.如果您的数组确实包含空白,请提供一个带有示例数据的mcve->a>以便我们可以对如何将其返回到bash->code>提出备选建议。例如:

    (subshell so ifs is only affected local
    IFS=$\n
    array=(perl-wmstrict-e'my@array=(foo“,”bar“,”quz baz);print join“\n”,@array'`)
    echo“0=<$数组[0]>1=<$数组[1]>2=<$数组[2]>”
    )
    < /代码> 
    
    

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

    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,则数组元素将由变量联接$,,这就是undef默认情况下,表示元素之间没有空格。这可能解释了你提到的行为(“数组变量没有空格连接”)

    请注意,上述内容将如果数组的元素包含空格,则按预期的方式工作,因为猛击将它们拆分为单独的数组元素。如果数组不包含空格,请提供MCVE使用示例数据,以便我们可以对如何将其返回猛击. 例如:

    ( # 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>

        2
  •  1
  •   Håkon Hægland    6 年前

    这里有一种使用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