我有一个perl脚本,收到3个arugments。
第一个参数很长,包含空格和引号,实际上我不知道它的大小可能是任何大小。为了区分我的论点,我使用“:”符号。
参见示例: ./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];
答案 0 :(得分:3)
是丢弃这些字符的shell。正确传递参数(包括引用包含空格的任何参数,并在其中转义任何引号),这不会是一个问题:
./my_script.pl "2MT5 4XAW KEAR TTRR YYMM \"TEMP 2012 FEB 01\"" "Single" "123.x"
然后你不需要搞乱分裂和加入。你首先要正确组织论据。
答案 1 :(得分:3)
你的Perl程序没有收到3个参数,它接收6个参数。只需将它们打印出来即可自行查看:
perl -le 'print for @ARGV' 2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single:123.x
你的第一个参数(2MT5)不是“很长”,它只有4个字符。
你没有Perl问题,你有一个shell问题。 shell在空格上拆分args并处理双引号。如果您不希望它这样做,那么您必须引用任何包含空格或引号的参数:
./my_script.pl '2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single:123.x'
答案 2 :(得分:0)
print
一个项目列表时,它们将被连接起来简单地。 执行您想要的操作的最简单方法是print "@ARGV";
,因为默认列表分隔符 for interpolated lists 是一个单独的空格。