0

我有收到3个arugments一个Perl脚本。perl脚本参数包含双定额“

第一个参数是很长,包含空格和引号,我居然不知道应该期待它可以是任何尺寸大小是什么要分开我的论点我用 “:” 签

见例如: ./my_script.pl 2MT5 4XAW KEAR TTRR YYMM “TEMP 2012年2月1”:单: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]; 

回答

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将空格分开并处理双引号。如果你不想这样做,那么你必须引用任何包含空格或引号的参数:

./my_script.pl '2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single:123.x' 
+0

谢谢单引号帮我 – Toren 2011-04-17 13:43:37

+0

谢谢,我正面临类似的问题 - 事实证明我有壳问题,就像你说过的@ tadmc – RockyMM 2014-08-29 18:08:44

3

它是壳丢弃这些字符。传递参数正确(包括引用任何包含空格,并逃避内部的任何报价),这将不会是一个问题:

./my_script.pl "2MT5 4XAW KEAR TTRR YYMM \"TEMP 2012 FEB 01\"" "Single" "123.x" 

那么你不需要惹分裂和加入的周围。您将首先正确地组织参数。

0
  • 当然你失去了双引号。这是标准的* NIX命令行行为,其中双引号表示您希望其中的内容作为一个参数处理。
  • 而当你的print项目列表,他们将被连接只需

,最简单的方式做你打算什么是print "@ARGV";因为默认列表分隔符,用于插值名单,是一个单一的空间。

+0

谢谢。你的回答帮助我理解了这个问题。 – Toren 2011-04-17 13:44:40