如何在 Perl 中检查多个模式匹配
有没有办法避免使用它进行多重模式检查?
我可以撕掉数组中的所有模式并检查它是否与模式数组中的任何模式匹配吗?请考虑当我有超过 20 个模式字符串时的情况。
if( ($_=~ /.*\.so$/)
|| ($_=~ /.*_mdb\.v$/)
|| ($_=~ /.*daidir/)
|| ($_=~ /\.__solver_cache__/)
|| ($_=~ /csrc/)
|| ($_=~ /csrc\.vmc/)
|| ($_=~ /gensimv/)
){
...
}
Is there a way I can avoid using this for multiple pattern checks?
Can I tore all the patterns in an array and check if it matches any pattern in the pattern array? Please consider the case when I have more than 20 pattern strings.
if( ($_=~ /.*\.so$/)
|| ($_=~ /.*_mdb\.v$/)
|| ($_=~ /.*daidir/)
|| ($_=~ /\.__solver_cache__/)
|| ($_=~ /csrc/)
|| ($_=~ /csrc\.vmc/)
|| ($_=~ /gensimv/)
){
...
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您可以使用 Perl 版本 5.10,那么有一个非常简单的方法可以做到这一点。
只需使用新的智能匹配 (~~) 运算符即可。
如果你不能使用 Perl 5.10,那么我会使用 List::MoreUtils::any 。
If you can use Perl version 5.10, then there is a really easy way to do that.
Just use the new smart match (~~) operator.
If you can't use Perl 5.10, then I would use List::MoreUtils::any.
Perl 5.10 之前的另一个选项是 Regexp::Assemble,它将采用一个列表模式并将它们组合成一个正则表达式,该正则表达式将立即测试所有原始条件。
Another pre-Perl 5.10 option is Regexp::Assemble, which will take a list of patterns and combine them into a single regex that will test all of the original conditions at once.
您的原始代码本来可以写得更好,如下所示:
那是因为
$_ =~ /foo/
与/foo/
相同。如果您有 Perl 5.10 或更高版本,我会按照 Brad 的建议使用智能匹配运算符。Your original code could have been written more nicely like this:
That is because
$_ =~ /foo/
is the same as just/foo/
. If you have Perl 5.10 or greater, I would do as Brad suggested and use the smart match operator.