【问题标题】:Perl next if regex stored in arrayPerl next 如果正则表达式存储在数组中
【发布时间】:2020-06-02 05:34:02
【问题描述】:

我有一段代码带有一个while循环和几个next if在循环中是这样的:

LOOP:
while (something) {
   next if $UPUPRF =~ /^T[0-9]{6}/;
   next if $UPUPRF =~ /^SECURITE.*/;
   next if $UPUPRF =~ /^AUDIT[A-Z]{2}/;
}

我想将这些正则表达式放在我的配置文件(perl 数据结构)中,而不是将它们“硬编码”在脚本中,以便用户只需编辑配置文件即可轻松编辑它们,并且希望您的关于这个的建议。

这样做最干净的方法是什么?

首先,我想我可以将这样的正则表达式存储在配置文件中吗? (带qr//):

 ....
 exclude_acct => [
                    qr/^T[0-9]{6}/,
                    qr/^AUDIT[A-Z]{2}/,
                    qr/^SECURITE.*/,
                 ],
 ....

在我的循环中,我应该使用这样的东西吗? :

foreach (@{ $myhash{exclude_acct} }) {
    next LOOP if $UPUPRF =~ /$_/;
}

感谢您的建议。

问候

注意:我还没有尝试过这段代码,只是猜测我可以这样做,但我主要想知道这是否“干净”或者是否有更清洁的方法

【问题讨论】:

  • 试试看是否有效。
  • 显然是这样。但是干净吗? :)
  • 更好的方法可能是将所有模式组合成一个带有| 分隔符的正则表达式,这样就不需要foreach 循环。
  • 有一个模块可以更有效地处理硬模式。见metacpan.org/pod/Regexp::Assemble
  • @simbabque, 前段时间,Perl 采用了使用 try 进行交替。 R::A 不再需要了。

标签: arrays regex loops perl


【解决方案1】:

这很好,但启动正则表达式引擎的成本相对较高,因此它比从多个正则表达式中创建一个要快。

# Once, before the loop.
my $pat = join "|", @{ $myhash{exclude_acct} };
my $re = qr/$pat/;

# In the loop.
next LOOP if $UPUPRF =~ $re;

不过,这可能会破坏反向引用 (\1)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多