如何在Perl中解析命令行开关?

如何在Perl中解析命令行开关?,perl,parsing,command-line,arguments,Perl,Parsing,Command Line,Arguments,为了在Perl中扩展my,我添加了对-r开关的支持,该开关支持在子目录中进行递归搜索。现在,命令行调用如下所示: perl pgrep.pl -r <directory> <expression> perl pgrep.pl-r -r和目录参数都是可选的(目录默认为“.”)。现在,我只需检查第一个参数是否为-r,如果是,则设置适当的标志,并使用shift操作扫描其余两个参数。如果-r出现在参数列表的末尾,或者更糟糕的是,出现在目录名和搜索表达式之间,这显然是个问题 一

为了在Perl中扩展my,我添加了对
-r
开关的支持,该开关支持在子目录中进行递归搜索。现在,命令行调用如下所示:

perl pgrep.pl -r <directory> <expression>
perl pgrep.pl-r
-r
目录
参数都是可选的(目录默认为“.”)。现在,我只需检查第一个参数是否为
-r
,如果是,则设置适当的标志,并使用shift操作扫描其余两个参数。如果
-r
出现在参数列表的末尾,或者更糟糕的是,出现在目录名和搜索表达式之间,这显然是个问题

一种解决方法是简单地从@ARGV数组中删除
-r
项,这样我就可以在剩下的参数中简单地移位,但是如果不在数组中的奇数位置获得一个“undef”,我就无法找到这样做的方法。欢迎您提出任何建议或使用不同的策略。

  • 为您的目录添加a-d开关。我的意见是,“如果命令是可选的,它应该有一个开关来启用它。”
  • 此外,在读取开关(及其参数)时,我会将其从数组中删除,只留下我的“表达式”。如果该数组中有多个元素,则表示有人写错了
    • 您应该使用。这将完成所需的所有操作。

      中关于“配置”的一章介绍了命令行切换处理的几种可能性,从perl的
      -s
      到处理这些问题的常用模块。举个例子,如果我以后需要,我可能会从开始并转换为

      use Getopt::Std;
      
      our $opt_r; # will be set to its value if used.
      getopts('r:'); # -r has an option.
      

      祝你好运,:)

      如何从数组中删除元素?使用“shift”遍历并处理参数或其他内容?因为我希望尽可能自由地四处移动,所以我可能会使用splice。它可能非常有用。my$switch=拼接(@ARGV$offset,1);非常感谢,splice正是我要找的。那个链接是最新的还是在很大程度上有所不同?@dsm:“perldoc?”链接更好,因为它返回的是最新版本。这里已经讨论过:我会选择一个不同的答案。好吧,被接受的答案并不能真正回答问题。