如何在 Perl 中检查多个模式匹配

发布于 2024-10-19 19:21:40 字数 297 浏览 3 评论 0原文

有没有办法避免使用它进行多重模式检查?

我可以撕掉数组中的所有模式并检查它是否与模式数组中的任何模式匹配吗?请考虑当我有超过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

回眸一遍 2024-10-26 19:21:40

如果您可以使用 Perl 版本 5.10,那么有一个非常简单的方法可以做到这一点。
只需使用新的智能匹配 (~~) 运算符即可。

use warnings;
use strict;
use 5.10.1;

my @matches = (
  qr/.*\.so$/,
  qr/.*_mdb\.v$/,
  qr/.*daidir/,
  qr/\.__solver_cache__/,
  qr/csrc/,
  qr/csrc\.vmc/,
  qr/gensimv/,
);

if( $_ ~~ @matches ){
  ...
}

如果你不能使用 Perl 5.10,那么我会使用 List::MoreUtils::any

use warnings;
use strict;
use List::MoreUtils qw'any';

my @matches = (
  # same as above
);

my $test = $_; # copy to a named variable

if( any { $test =~ $_ } @matches ){
  ...
}

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.

use warnings;
use strict;
use 5.10.1;

my @matches = (
  qr/.*\.so$/,
  qr/.*_mdb\.v$/,
  qr/.*daidir/,
  qr/\.__solver_cache__/,
  qr/csrc/,
  qr/csrc\.vmc/,
  qr/gensimv/,
);

if( $_ ~~ @matches ){
  ...
}

If you can't use Perl 5.10, then I would use List::MoreUtils::any.

use warnings;
use strict;
use List::MoreUtils qw'any';

my @matches = (
  # same as above
);

my $test = $_; # copy to a named variable

if( any { $test =~ $_ } @matches ){
  ...
}
自演自醉 2024-10-26 19:21:40

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.

全部不再 2024-10-26 19:21:40

您的原始代码本来可以写得更好,如下所示:

if(  /.*\.so$/
  || /.*_mdb\.v$/
  || /.*daidir/
  || /\.__solver_cache__/
  || /csrc/
  || /csrc\.vmc/
  || /gensimv/
) { ... }

那是因为 $_ =~ /foo//foo/ 相同。如果您有 Perl 5.10 或更高版本,我会按照 Brad 的建议使用智能匹配运算符。

Your original code could have been written more nicely like this:

if(  /.*\.so$/
  || /.*_mdb\.v$/
  || /.*daidir/
  || /\.__solver_cache__/
  || /csrc/
  || /csrc\.vmc/
  || /gensimv/
) { ... }

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文