4

为了在 Perl 中扩展我的“grep”模拟器,我添加了对一个-r开关的支持,该开关可以在子目录中进行递归搜索。现在命令行调用看起来像这样:

perl pgrep.pl -r <directory> <expression>

-r和参数都是可选的(directory目录默认为'.')。到目前为止,我只需检查第一个参数是否是-r,如果是则设置适当的标志,然后使用移位操作扫描其余两个参数。-r如果出现在参数列表的末尾或更糟 - 在目录名称和搜索表达式之间,这显然会是一个问题。

一种解决方法是简单地从 @ARGV 数组中删除该-r项目,这样我就可以简单地将剩余的参数移入,但我无法找到一种方法来做到这一点,而不会在我的奇数位置获得“undef”大批。欢迎您使用任何建议或不同的策略。

4

4 回答 4

21

你应该使用GetOpt::Long. 这将完成您所描述的一切。

于 2009-02-03T15:08:50.667 回答
4
use Getopt::Std;

our $opt_r; # will be set to its value if used.
getopts('r:'); # -r has an option.
于 2009-02-03T15:30:34.150 回答
1
  • 为您的目录添加 -d 开关。我的意见是,“如果一个命令是可选的,它应该有一个开关来启用它。”
  • 此外,当我阅读它们时,我会从数组中删除开关(及其参数),只留下我的“表达式”。如果该数组中有超过 1 个元素,则说明有人写错了。
于 2009-02-03T15:06:19.347 回答
0

我在Mastering Perl中关于“配置”的章节介绍了命令行切换处理的几种可能性,从 perl-s到处理这些的流行模块。对于您的示例,如果以后需要,我可能会从Getopt::Std开始,然后转换为Getopt::Long 。

祝你好运, :)

于 2009-02-11T18:25:34.510 回答