首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态编译动态创建的regexp的简明方法

动态编译动态创建的regexp的简明方法
EN

Stack Overflow用户
提问于 2016-04-08 15:09:01
回答 1查看 57关注 0票数 2

我想动态地创建一个编译好的regexp。嗯,没问题:

代码语言:javascript
复制
my $rx = join('|', keys %replacement_hash);

我想编译它以避免重复调用的开销。也没有问题:

代码语言:javascript
复制
$rx = qr/$rx/;

但问题是,对于如此琐碎的操作来说,时间太长了。两行和两次我需要提到变量名,所以如果我决定重命名的话,我需要在所有三个位置上更改它。

到目前为止,我已经使用了一个助手函数(它仍然有一些缺点,必须将这个函数保存在某个地方):

代码语言:javascript
复制
sub qr_expr { qr/$_[0]/ }
# and later
my $rx = qr_expr(join('|', keys %replacement_hash));

或者只是在我需要它的地方插入相同的功能:

代码语言:javascript
复制
my $rx = sub{qr/$_[0]/}->(join('|', keys %replacement_hash));

有没有办法写得更简洁些?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-08 17:33:38

代码语言:javascript
复制
my ($re) = map qr/$_/, join '|', map quotemeta, @strings;

很可能你不需要编译它。

大多数情况下,您最终会将其嵌入到另一个模式中(例如,/^$re\z//($re)/),从而强制重新编译该模式。(/$re/不重新编译,等效的=~ $re也不重新编译。)

此外,Perl缓存它所编译的最后一个模式的编译形式。如果要求它再次编译相同的模式,它只是返回缓存的副本。

在这两种情况下,以下几点就足够了:

代码语言:javascript
复制
my $pat = join '|', map quotemeta, @strings;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36503125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档