如何使Perl的Getopt :: Long不在参数名中处理文字=?

时间:2009-08-14 02:21:09

标签: perl getopt-long

我编写了一个Perl程序“transfer.pl”,输入参数是哈希值(键和值是字符串)。代码段是:

my %transfers = ();

if (!GetOptions("transfer=s" => \%transfers))
{
    Usage();
    exit(1);
}

我使用的是windows系统。在命令行上,我输入了:

  

perl tranfer.pl --transfer“table =%s”=“[TableName =%s]”

我希望密钥为table = %s,值为[TableName=%s],但似乎Getopt :: Long始终找到第一个=,因此密钥为table且值为%s=[TableName=%s]

当我输入

  

perl tranfer.pl --transfer“table \ =%s”=“[TableName \ =%s]”

密钥为table \,值为%s=[TableName\=%s]

我想知道如何绕过我的字符串值中的“=”并使代码按照我的预期进行操作?

非常感谢!

2 个答案:

答案 0 :(得分:2)

Getopt::Long不允许这样做;第一个=始终用于将键与值分开。您需要使用user-defined subroutine来处理该选项,或者在key=value完成后拆分GetOptions对,或者使用一些任意转义机制,例如使用“%25”来代表密钥中的=

答案 1 :(得分:1)

来自Getopt::Long

如果选项目标是对散列的引用,则该选项将采用形式为key = value的字符串作为值。该值将与散列中的指定键一起存储。

GetOptions ("define=s" => \%defines);

或者你可以使用:

GetOptions ("define=s%" => \$defines);

与命令行选项一起使用时:

--define os=linux --define vendor=redhat

它将始终在第一个“=”上分开。