基于正则表达式的Perl参数切换

时间:2012-12-11 18:03:59

标签: regex perl arguments pcre

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

                    switch ($ARGV[0]) {

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


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

现在,我有一个命令cmd3有参数的情况,如--cmd3=SOMETHING中所示。由于SOMETHING可能会有所不同,因此简单的开关/外壳不再起作用。基本上,我需要在命令本身上做一个开关/案例。我以为我可以使用正则表达式,第一个匹配组是命令,第二个是可选的等号。以下内容不起作用,但它说明了我正在尝试做的事情。

                    $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;
                    }

::::::::::::::::::::::::::::::::::: EDIT ::::::::::: ::::::::::::::::::::::::::::::::::::::::::

我明白了,但是我会给那个回答upvotes并接受的人。我无法使用,因为这意味着重组一切。这是解决方案。

                   switch ($ARGV[0]) {

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

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

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

2 个答案:

答案 0 :(得分:5)

为什么不使用Getopt::Long

答案 1 :(得分: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}