我正在Perl中开发一个小实用程序脚本,主要用于学习该语言。该脚本具有充当动作调度程序的主要功能以及许多小动作例程,每个小动作例程执行一个特定任务(例如,打印今天的一天,计算年龄超过7天的文件等)。用户将使用“./myscript doy”,“。/ myscript doy 01/01/2013”,“。/ myscript ls / home / test gt 7天”等语法调用脚本。通常它是“./ myscript动作[params& keywords的混合]“。关键字可以是“小于”,“大于”等。即使关键字发生更改(而不是根据父操作中的关键字执行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用于与命令行参数(已加入)进行比较,以确定所请求的操作。
现在,为了减轻动作例程的负担,我想在main函数中创建一个参数数组,并将其作为参数传递给动作例程。因此命令行如“./myscript ls / home / test gt 7 days”将导致@args = ['/ home / test',7]。问题是我无法找到一种方法来识别要插入@args的有效反向引用($ 1,$ 2,...)的数量。当然,我知道每个动作的预期参数数量,但目的是保持它的通用性。我找到的一个选项是检查范围(1..10),如“if(defined $ {$ i})”。这在循环中使用时不能与“use strict”选项一起使用。请建议是否有更好的方法来捕获匹配的参数并将它们传递给动作。
答案 0 :(得分:3)
反向引用是匹配先前捕获的内容的正则表达式指令(例如\1
)。您实际上想要捕获的数量((...)
)。
由于正则表达式匹配返回它在列表上下文中捕获的内容,因此您只需要计算那些
my @captures = $str =~ /.../;
my $count = @captures;
或
my $count = my @captures = $str =~ /.../;
或
my $count = () = $str =~ /.../;
您还可以查看@-
。
my $count = /.../ ? $#- : undef;