问题描述
||
我有一个Perl脚本,可以接收3个结果。
第一个参数很长,包含空格和引号,我实际上不知道期望多大的大小。为了分隔参数,我使用\“:\”符号。
参见示例:
./my_script.pl 2MT5 4XAW KEAR TTRR YYMM \“ TEMP 2012 FEB 01 \”:单一:123.x
问题是我丢失了双引号和空格。请参见输出:
LOG The 1st input is:2MT54XAWKEARTTRRYYMMTEMP 2012 FEB 01
LOG Type is:Single
LOG Version is:123.x
我的代码:
open (FD,\">file2.txt\");
print FD @ARGV;
close FD;
my $str1=`cat file2.txt`;
my @argv_values = split(\':\',$str1);
$new_str = $argv_values[0];
$type = $argv_values[1];
$ver = $argv_values[2];
解决方法
您的Perl程序不接收3个参数,而是接收6个参数。只需将它们打印出来即可自己查看:
perl -le \'print for @ARGV\' 2MT5 4XAW KEAR TTRR YYMM \"TEMP 2012 FEB 01\":Single:123.x
您的第一个参数(2MT5)不是\“ very long \”,它只有4个字符。
您没有Perl问题,而有外壳问题。 Shell在空格上分割args并处理双引号。如果您不希望它这样做,那么必须引用任何包含空格或引号的参数:
./my_script.pl \'2MT5 4XAW KEAR TTRR YYMM \"TEMP 2012 FEB 01\":Single:123.x\'
,是外壳丢弃这些字符。正确传递参数(包括用引号将包含空格的内容转义,并转义其中的任何引号),这样就不会出现问题:
./my_script.pl \"2MT5 4XAW KEAR TTRR YYMM \\\"TEMP 2012 FEB 01\\\"\" \"Single\" \"123.x\"
这样一来,您就无需再进行拆分和合并了。首先,您将正确组织参数。
,当然,您会丢失双引号。这是标准的* NIX命令行行为,其中双引号表示您希望将其中的内容视为一个参数。
当您在项目列表中“ 5”时,它们将被简单地串联在一起。
做您打算做的最简单的方法是ѭ6,因为内插列表的默认列表分隔符是一个空格。