1

我正在用 Perl 开发一个小型实用程序脚本,主要是为了学习该语言。该脚本有一个作为动作调度程序的主要功能和许多执行一项特定任务的小动作例程(如打印今天的一年中的哪一天,计算年龄超过 7 天的文件等)。用户将使用诸如“./myscript doy”、“./myscript doy 01/01/2013”​​、“./myscript ls /home/test gt 7 days”等语法来调用脚本。通常它是“./ myscript 动作 [参数和关键字的组合]”。关键字可以是“小于”、“大于”等。即使关键字发生变化,目标操作也可能不同(而不是根据父操作中的关键字执行 if..else)。

调度表是一个散列如下

my %Actions =
(   # Syntax => [RegEx, Description, Function]
    'help' => ['help', 'Displays this help', \&PrintHelp],
    'doy' => ['doy', 'Day of Year', \&DayOfYear],
    'doy <dd/mm/yyyy>' => ['doy (\d{2}/\d{2}/\d{4})', 'Day of Year for a date', \&DayOfYearForDate]
)

散列的关键是命令语法本身(作为帮助的一部分显示给用户,以及描述)。RegEx 用于与命令行参数(已连接)进行比较,以决定请求的操作。

现在,为了减轻动作例程的负担,我想在主函数中创建一个参数数组,并将其作为参数传递给动作例程。所以像“./myscript ls /home/test gt 7 days”这样的命令行会导致@args = ['/home/test', 7]。问题是我无法找到一种方法来识别要插入@args 的有效反向引用($1、$2、...)的数量。当然,我知道每个操作的预期参数计数,但目的是保持通用性。我发现的一个选项是检查一个范围 (1..10),如“if (defined ${$i})”。这在循环中使用时不适用于“使用严格”选项。请建议是否有更好的方法来捕获匹配的参数并将它们传递给动作。

4

1 回答 1

3

反向引用是一个正则表达式指令,用于匹配先前捕获的内容(例如\1)。您实际上想要捕获的数量 ( (...))。

由于正则表达式匹配返回它在列表上下文中捕获的内容,因此您只需要计算那些

my @captures = $str =~ /.../;
my $count = @captures;

或者

my $count = my @captures = $str =~ /.../;

或者

my $count = () = $str =~ /.../;

你也可以检查一下@-

my $count = /.../ ? $#- : undef;
于 2013-06-19T09:17:17.587 回答