基于regex的Perl参数切换

基于regex的Perl参数切换,regex,perl,arguments,pcre,Regex,Perl,Arguments,Pcre,我有一个接受参数的Perl脚本。当我有单值参数时,以下代码就足够了: switch ($ARGV[0]) { case "--cmd1" { $action = "cmd1"; } case "--cmd2" { $act

我有一个接受参数的Perl脚本。当我有单值参数时,以下代码就足够了:

                    switch ($ARGV[0]) {

                    case "--cmd1" {
                            $action = "cmd1";
                    }


                    case "--cmd2" {
                            $action = "cmd2";
                    }
现在,我有一个例子,命令
cmd3
有一个参数,如
--cmd3=SOMETHING
。由于
某些东西可以变化,因此简单的开关/外壳不再工作。基本上,我需要对命令本身进行切换/案例。我想我可以使用正则表达式,第一个匹配组是命令,第二个是可选的equals。下面的内容不起作用,但它说明了我正在尝试做的事情

                    $ARGV[0] =~ m/(.*?)(=.*){0,1}/;
                    my $cmd = $1;
                    my $equals = $2;

                    switch ($cmd) {

                    case "--cmd1" {
                            $action = "cmd1";
                    }

                    case "--cmd2" {
                            $action = "cmd2";
                    }

                    case "--cmd3" {
                            $action = "cmd3";
                            print $equals;
                    }
:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑:编辑

我想出来了,但我会给回答问题的人投票并接受。我不能使用if,因为这意味着重组一切。这是解决办法

                   switch ($ARGV[0]) {

                    case "--cmd1" {
                            $action = "cmd1";
                    }

                    case "--cmd2" {
                            $action = "cmd2";
                    }

                    case m/--cmd3(=.*)?/ {
                            $ARGV[0] =~ m/--cmd3(=.*)?/;
                            $action = "cmd3";
                            print $1;
                    }

像这样的怎么样

my $cmd = "";
my $equals = "";

if($ARGV[0] =~ m/^\-\-cmd1$/){$cmd="cmd1"}
if($ARGV[0] =~ m/^\-\-cmd2$/){$cmd="cmd2"}
if($ARGV[0] =~ m/^\-\-cmd3=(.*)$/){$cmd="cmd3";$equals=$1}

像这样的怎么样

my $cmd = "";
my $equals = "";

if($ARGV[0] =~ m/^\-\-cmd1$/){$cmd="cmd1"}
if($ARGV[0] =~ m/^\-\-cmd2$/){$cmd="cmd2"}
if($ARGV[0] =~ m/^\-\-cmd3=(.*)$/){$cmd="cmd3";$equals=$1}

为什么不使用?

为什么不使用?

为什么不使用
Getopt::*
?将可能的命令放在调度表中,使用哈希键作为文本命令名,代码引用作为哈希值。然后在模式匹配之后,您可以说,“
$dispatch{$1}->($2)
”Perl的开关是一个(不推荐使用的)源代码过滤器黑客。give/when或for/when可能更好,但我更倾向于使用基于哈希的分派来处理类似的事情。@David但是我如何才能将--cmd3放入哈希表中呢?参数可以是--cmd3=AAA或--cmd3=BBB。还是一样的论点。我需要基于等号拆分命令,但等号并不总是像在cmd2和cmd1中那样存在。整个系统已使用交换机构建。不能改变。“不能改变”?那么你就不能添加额外的参数了,是吗?你必须改变一些事情。当您这样做时,请删除至少一个使用不推荐的错误开关()的实例。为什么不使用
Getopt::*
?将可能的命令放在调度表中,使用哈希键作为文本命令名,代码引用作为哈希值。然后在模式匹配之后,您可以说,“
$dispatch{$1}->($2)
”Perl的开关是一个(不推荐使用的)源代码过滤器黑客。give/when或for/when可能更好,但我更倾向于使用基于哈希的分派来处理类似的事情。@David但是我如何才能将--cmd3放入哈希表中呢?参数可以是--cmd3=AAA或--cmd3=BBB。还是一样的论点。我需要基于等号拆分命令,但等号并不总是像在cmd2和cmd1中那样存在。整个系统已使用交换机构建。不能改变。“不能改变”?那么你就不能添加额外的参数了,是吗?你必须改变一些事情。执行此操作时,请删除至少一个使用已弃用且存在错误的switch()的实例。系统已手动解析出参数。这是无法改变的。我只是添加了这个附加功能。因此,您可以使用
Getopt::Long
。系统已经通过手动解析参数实现。这是无法改变的。我只是添加了这个附加功能。所以您可以使用
Getopt::Long
。我的错误是,cmd3上的equals是可选的--cmd3和--cmd3=某些内容会产生不同的结果,并且都是有效的。不过,您可以保留accept。如果您继续使用它并且不介意“hacky”,您可以轻松添加这一行来捕获另一种形式的
cmd3
If($ARGV[0]=~m/^\-\-cmd3$/){$cmd=“cmd3”}
您的正则表达式中不需要转义
-
字符。另外,前两个实际上应该是
if($ARGV[0]eq'--cmd1')
,因为您没有使用regex功能。我的错误是,cmd3上的equals是可选的--cmd3和--cmd3=某些内容会产生不同的结果,并且都是有效的。不过,您可以保留accept。如果您继续使用它并且不介意“hacky”,您可以轻松添加这一行来捕获另一种形式的
cmd3
If($ARGV[0]=~m/^\-\-cmd3$/){$cmd=“cmd3”}
您的正则表达式中不需要转义
-
字符。另外,前两个实际上应该是
if($ARGV[0]eq'--cmd1')
,因为您没有使用regex功能。