使用双感叹匹配Perl中的cond [英] matching cond in perl using double exclaimation

查看:29
本文介绍了使用双感叹匹配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) ...

(但我还是喜欢使用//然后,觉得更清楚)

上面我使用qr,但是简单的q()就可以了(虽然我绝对推荐qr)。它们也几乎采用任何字符作为分隔符。


§在模式中,求值变量用作正则表达式模式,通常有什么问题(如果是这样的话,应使用qr编译,从而用作子模式)。

一个没有想象力的示例:在模式内计算的变量$var = q(s)(文字反斜杠后跟字母s)将生成s序列,然后将其视为空格的正则表达式模式。(可能是无意的;我们只想要s。)

使用quotemeta/Q$varE/可以纠正这一问题,以便转义$var中可能的元字符;这会产生文字字符\s的正确模式。因此,编写模式的正确方式是m{^Q$varE/}

如果做不到这一点,也会导致注入错误。感谢池上对此发表评论。

这篇关于使用双感叹匹配Perl中的cond的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆