我需要构建一个匹配给定哈希中任何键的正则表达式。这可以通过以下方式轻松实现
my $string = join('|', keys %hash);
my $regex = qr/$string/;
在哪里
%hash
是有问题的哈希。出于好奇:有没有办法避免引入虚拟变量 $string
并直接将任意函数的返回值编译成正则表达式(定义自定义子或原型(prototype)除外)?公式不同:qr
也有函数形式(如 readpipe
的 qx
)?提前致谢!
最佳答案
您可以将任意代码插入到任何双引号结构(qq、qr、qx)中。$foo
插入一个标量变量。 ${ code-returing-a-scalar-reference }
插入任意代码。因此,为了避免虚拟变量,您可以:
my $regex = qr/${ \join('|', keys %hash) }/;
但正如评论中提到的,如果你只想匹配等于其中一个键的字符串,你想添加
\A
(或 ^
)和 \z
anchor 。否则,您将匹配包含其中一个键的任何字符串。如果您的键可能包含正则表达式元字符,您还需要引用它们,例如:
my $regex = qr/\A(?:${ \join('|', map quotemeta, sort keys %hash) })\z/;
关于regex - 有没有办法在单个语句中将某个函数的返回值编译成正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61412329/