如何从Bash脚本调用不可修改的Perl模块并获取多个返回值
问题:从Bash中获取Perl函数回传的两个参数值
现有Perl模块MyModule中的MyFunction函数通过参数回传两个结果值,但当前Bash调用方式只能获取到最后一个回传值,且无法修改Perl函数代码,需求是同时获取这两个回传值用于后续操作。
现有Perl模块代码
package MyModule; sub MyFunction { my $var_0 = $_[0]; my $var_1; my $var_2; if ($var_0 =~ /WA/) { $var_1 = "Olympia"; $var_2 = "Population is 53,000"; } elsif ($var_0 =~ /OR/) { $var_1 = "Salem"; $var_2 = "Population is 172,000"; } $_[1] = $var_1; $_[2] = $var_2; return 0; # no error }
当前Bash调用方式(仅能获取最后一个值)
VAL=`perl -I. -MMyModule -e 'print MyModule::MyFunction("WA")'` echo $VAL
解决方案
核心思路是在Perl调用代码中传入两个可被函数修改的变量,将函数回传的两个值用无冲突分隔符拼接后输出,再在Bash中拆分结果到单独变量。
方法1:使用Bash内置拆分(推荐)
# 调用Perl函数,传递两个变量接收回传值,用|拼接输出 IFS='|' read -r CITY POPULATION <<< "$(perl -I. -MMyModule -e 'my ($a, $b); MyModule::MyFunction("WA", $a, $b); print "$a|$b"')" # 后续使用变量 echo "城市:$CITY" echo "人口信息:$POPULATION"
方法2:使用cut命令拆分
# 获取拼接后的结果 RESULT=$(perl -I. -MMyModule -e 'my ($a, $b); MyModule::MyFunction("WA", $a, $b); print "$a|$b"') # 拆分到单独变量 CITY=$(echo "$RESULT" | cut -d'|' -f1) POPULATION=$(echo "$RESULT" | cut -d'|' -f2) # 验证输出 echo "城市:$CITY" echo "人口信息:$POPULATION"
注意事项
- 分隔符需选择不会出现在回传值中的字符,若结果可能包含
|,可替换为制表符\t,对应Bash中设置IFS=$'\t',Perl中输出改为print "$a\t$b"。 - Perl代码中必须显式声明两个变量并作为参数传入,否则函数无法修改并回传值。
内容的提问来源于stack exchange,提问作者Khai
相关产品推荐
相关产品推荐

