perl脚本参数包含双配额“

时间:2011-04-14 12:22:15

标签: perl command-line-arguments argument-passing perl-data-structures

我有一个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];

3 个答案:

答案 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)

  • 当然你会丢失双引号。这是标准的* NIX命令行行为,其中双引号表示您希望将其中的内容视为一个参数。
  • 当你print一个项目列表时,它们将被连接起来简单地

执行您想要的操作的最简单方法是print "@ARGV";,因为默认列表分隔符 for interpolated lists 是一个单独的空格。