如何在Perl中解析引用的和不带引号的参数?

时间:2011-06-01 13:03:27

标签: perl command-line

我希望我的perl脚本能够正确地将由空格分隔的两个命令行参数解析为两个变量:

$ cat 1.pl
print "arg1 = >$ARGV[0]<\n";
print "arg2 = >$ARGV[1]<\n";
$ perl 1.pl a b
arg1 = >a<
arg2 = >b<
$ perl 1.pl "a b"
arg1 = >a b<
arg2 = ><
$

是否存在处理此问题的通用方法,而不是尝试检测是否使用了引号?

2 个答案:

答案 0 :(得分:10)

shell将数据传递给Perl。

  • program a b会发送ab
  • program 'a b'将发送a b
  • program "a b"将发送a b
  • program a\ b将发送a b

Perl有,AFAIK,无法区分最后三个中的任何一个。

你可以split关于空格的每个参数,这将得到你描述的效果......但是这意味着以不同的方式工作到那里的每个其他应用程序。

答案 1 :(得分:1)

昆汀对Windows的回答并不完全正确。

同时,如果你想解析开关,Getopt :: Long是最好的。但是如果你有两个非开关参数,你可以试试这个暴力方法:

my @args = map { split ' ' } @ARGV;
die usage() unless @args == 2; 

或者这个:

die usage() 
    unless (
    my ( $arg1, $arg2 )
        = @ARGV == 1 ? ( split ' ', $ARGV[0], 3 )
        : @ARGV == 2 ? @ARGV
        :              ()
    ) == 2
    ;

在这里,die usage()只是一个伪代码。