我想动态地创建一个编译好的regexp。嗯,没问题:
my $rx = join('|', keys %replacement_hash);我想编译它以避免重复调用的开销。也没有问题:
$rx = qr/$rx/;但问题是,对于如此琐碎的操作来说,时间太长了。两行和两次我需要提到变量名,所以如果我决定重命名的话,我需要在所有三个位置上更改它。
到目前为止,我已经使用了一个助手函数(它仍然有一些缺点,必须将这个函数保存在某个地方):
sub qr_expr { qr/$_[0]/ }
# and later
my $rx = qr_expr(join('|', keys %replacement_hash));或者只是在我需要它的地方插入相同的功能:
my $rx = sub{qr/$_[0]/}->(join('|', keys %replacement_hash));有没有办法写得更简洁些?
发布于 2016-04-08 17:33:38
my ($re) = map qr/$_/, join '|', map quotemeta, @strings;很可能你不需要编译它。
大多数情况下,您最终会将其嵌入到另一个模式中(例如,/^$re\z/或/($re)/),从而强制重新编译该模式。(/$re/不重新编译,等效的=~ $re也不重新编译。)
此外,Perl缓存它所编译的最后一个模式的编译形式。如果要求它再次编译相同的模式,它只是返回缓存的副本。
在这两种情况下,以下几点就足够了:
my $pat = join '|', map quotemeta, @strings;https://stackoverflow.com/questions/36503125
复制相似问题