0

我有一个接收 3 个参数的 perl 脚本。

第一个参数很长,包含空格和引号,实际上我不知道期望它的大小可以是任何大小。为了分隔我的论点,我使用“:”符号。

参见示例:./my_script.pl 2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single: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];
4

3 回答 3

3

是外壳丢弃了这些字符。正确传递参数(包括引用任何包含空格的参数,并转义内部的任何引号),这不会是一个问题:

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

然后你就不需要搞乱分裂和加入了。首先,您将正确组织论点。

于 2011-04-14T12:29:54.547 回答
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'
于 2011-04-14T12:43:57.773 回答
0
  • 当然您会丢失双引号。这是标准的 *NIX 命令行行为,其中双引号表示您希望将其中的内容视为一个参数。
  • 当您print列出项目时,它们将被简单地连接起来。

做你想做的最简单的方法是print "@ARGV";因为默认的列表分隔符,对于插值列表,是一个空格。

于 2011-04-14T12:36:18.863 回答