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