匹配哈希键时,Perl转义通配符

时间:2019-02-14 18:38:47

标签: regex perl

请提出如何对哈希键中的通配符进行转义。

print "pattern exists\n" if /.ISPV3-21*02/ ~~ %reads;

谢谢

1 个答案:

答案 0 :(得分:4)

首先,请注意smartmatch(~~)是实验性的,因此不建议使用它。*对于此任务,您可以使用any from List::Util或在较早的Perls grep上可以提供相同的服务目的。

如果要匹配精确的字符串,请使用quotemeta,也可以在插值字符串中将其写为\Q

use strict;
use warnings;
use List::Util 1.33 'any';
print "pattern exists\n" if any { m/\Q.ISPV3-21*02/ } keys %reads;

您还可以使用index函数来查找确切的子字符串。

print "pattern exists\n" if any { index($_, '.ISPV3-21*02') >= 0 } keys %reads;

如果您要匹配整个键,而不仅仅是键中的子字符串,则需要使用\A(字符串开头,与^)和{ {1}}(字符串的结尾)。

\z

但这与测试string equality相同。

print "pattern exists\n" if any { m/\A\Q.ISPV3-21*02\E\z/ } keys %reads;

这与仅检查键exists是否相同,因为您正在浏览哈希键。

print "pattern exists\n" if any { $_ eq '.ISPV3-21*02' } keys %reads;

*智能匹配是retroactively made experimental引入实验功能的一部分,这是因为它的规则集过于复杂(您还必须通过文档中的whole table来找出任意两个操作数,以及作为它们的每个内容,将解析为与bitwise operators相同的字符串/数字歧义。它已经对提议的更改进行了多次迭代,并且在某些时候可能已被弃用或不兼容地进行更改,因此不应依赖它。