你好我正在寻找一个Perl单行,如果可能的话,扫描我们所有的Javascript文件,找到所谓的“流氓逗号”。也就是说,来自数组或对象数据结构末尾的逗号,以及紧接在']'或'}'字符之前的逗号。
我遇到的主要挑战是如何使正则表达式检查]或}非贪婪。正则表达式需要跨越多行,因为逗号可以结束一行,然后是下一行的}或者},但我已经在Minimal Perl一书的帮助下想出了如何做到这一点。
另外,我希望能够将大量文件传递给这个Perl正则表达式(通过find / xargs),所以我想打印输入文件的名称,以及其中的行号文件。
以下是我的各种尝试,并不是特别接近我的bash历史。提前致谢:
find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+$/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+\]/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+[\]\}]/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+[\]\}]/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+[\]\}]/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+}/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+}?/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,\s+}+?/ and print $_;' | wc -l find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,$/' and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/,$/ and print $_;' find winhome/workspace/SsuExt4Zoura/quotetool/js
-name "*.js" | xargs perl -00 -wnl -e '/\,$/ and print $_;'
答案 0 :(得分:1)
使用-00
开关,您可以更改记录分隔符,并且(可能)将整个文件放在一行中,这样您就可以找到多行尾随逗号。但是,它也使print $_
打印整行。你可能想要的是打印文件名:
print $ARGV if /,\s*[\]\}]/;
答案 1 :(得分:0)
其中大多数看起来像是解决问题的一个好方法,只有一个小问题。您可能需要,\s*(?:$|[\]\}])
而不是,\s+(?:$|[\]\}])
,因为可能没有一个空格。您的+
量词可能会错过,]
等表单。
话虽如此,JavaScript可能非常微妙,您可能会遇到评论和其他内容,这些内容可能会在意外发生之前以逗号结束,例如文件末尾或}
。一个廉价的解决方案可能是使用perl s///
表单在应用测试之前简单地删除所有注释。
如果您正在处理JSON,JSON :: XS可以使用其宽松选项强制执行有效性。
如果您需要真正的验证,可能就像JSLint一样。我使用Rhino嵌入JavaScript(使用Perl和SpiderMonkey稍微少一些)并使用它作为一组针对JavaScript代码的测试将是一个确保长期可靠性的好方法。
答案 2 :(得分:0)
解决此问题的一个简单方法是使用逗号优先样式。由于逗号永远不会出现在一行的末尾,因此永远不会有“尾随逗号”。
例如:
var myObj = { foo: 1
, bar: 2
, baz: 4
}
您可以轻松检测是否缺少逗号,很明显哪些元素属于哪些大括号,并且从不存在“尾随逗号问题”。