使用双感叹匹配Perl中的cond [英] matching cond in perl using double exclaimation
本文介绍了使用双感叹匹配Perl中的cond的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
if ($a =~ m!^$var/!)
$var
是二维哈希中的键,$a
是另一个哈希中的键。
此表达式的意思是什么?
推荐答案
这是一个regular expression(";regex";),其中!
字符用作要在其通过=~
operator绑定到的字符串中匹配的模式的分隔符(这里的$a
†)。
$a =~ /^$var//
(那么m
可以省略);但是现在模式中使用的任何/
都必须转义。为了避免这种难看且嘈杂的/
组合,人们通常使用另一个字符作为分隔符,因为几乎可以使用任何字符(我最喜欢的是卷边,m{^$var/}
)。‡§
问题中的此正则表达式测试变量$a
中的值是否以变量$var
的值开头(通过^
anchor),然后是/
(计算变量并使用结果)。§
†不是变量名的好选择,因为$a
和$b
由内置sort
‡由于提前准备了模式,甚至不需要分隔符
my $re = qr{^$var/};
if ($string =~ $re) ...
(但我还是喜欢使用//
然后,觉得更清楚)
q()
就可以了(虽然我绝对推荐qr
)。它们也几乎采用任何字符作为分隔符。
§在模式中,求值变量用作正则表达式模式,通常有什么问题(如果是这样的话,应使用qr
编译,从而用作子模式)。
一个没有想象力的示例:在模式内计算的变量$var = q(s)
(文字反斜杠后跟字母s
)将生成s
序列,然后将其视为空格的正则表达式模式。(可能是无意的;我们只想要和
s
。)
/Q$varE/
可以纠正这一问题,以便转义$var
中可能的元字符;这会产生文字字符\s
的正确模式。因此,编写模式的正确方式是m{^Q$varE/}
。
如果做不到这一点,也会导致注入错误。感谢池上对此发表评论。
这篇关于使用双感叹匹配Perl中的cond的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文