请提出如何对哈希键中的通配符进行转义。
print "pattern exists\n" if /.ISPV3-21*02/ ~~ %reads;
谢谢
答案 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相同的字符串/数字歧义。它已经对提议的更改进行了多次迭代,并且在某些时候可能已被弃用或不兼容地进行更改,因此不应依赖它。