所以我设法用正则表达式创造了一些黑魔法。我试图解析一些命令行参数,并且我想接受格式为test[somethinginhere]
的任何参数,其中“somethinginhere”是要运行的测试的名称。红宝石正规魔法黑色
这就是代码的样子。 Theres后面的代码实际上是用布尔值执行函数,但是这是处理参数的部分。
ARGV.each do |arg|
case arg.downcase
when "help"
@help = true
when "install"
@install = true
when "deploy"
@deploy = true
when "configure"
@configure = true
when /^test\[([a-z]+)\]$/
@test << arg.downcase[/^test\[([a-z]+)\]$/,1]
else
@usage = true
end
end
现在,这里的地方魔法进来:这一计划将针对不包括小写字母“S”的任何测试名正常运行。下面将通过:
$ ./AutoTest.rb test[a]
Running Test "ATest"
$ ./AutoTest.rb test[b]
Running Test "BTest"
$ ./AutoTest.rb test[anything]
Running Test "AnythingTest"
下会失败:
$ ./AutoTest.rb test[s]
Usage: AutoTest [help|install|deploy|configure|test[*]]
但这会通过:
$ ./AutoTest.rb test[S]
Running Test "STest"
实际上,与它的一个小写的内线很少会失败:
$ ./AutoTest.rb test[user]
Usage: AutoTest [help|install|deploy|configure|test[*]]
除非是s大写:
$ ./AutoTest.rb test[uSer]
Running Test "UserTest"
的唯一结论,然后我可以来的是,这个正则表达式已经挖掘到黑魔法的秘密,在这一点上变得如此强大,它甚至可以解析它自己的HTML。
但严重的是,这是怎么回事?
使用任何类型的命令行也具有特殊的意义为您的外壳上的性格可能是一个坏主意。这包括几乎所有*转移数字部门中的所有内容,从'!'到')'。为什么不使用更传统的'--test = s'或'test s'类型语法呢? – tadman 2012-07-13 18:44:42
'test s'不起作用,因为我允许用户将几个命令串在一起,例如'./AutoTest.rb安装deploy config test-all'。所以我要用短划线去。 – 2012-07-13 19:56:51
如果您重新编写参数解析器来处理多部分参数,它将起作用。另一方面,要使用'rake'作为例子,你可能需要使用':'作为分隔符,比如'rake db:migrate'。 – tadman 2012-07-13 19:58:58