使用双感叹号匹配perl中的cond
if ($a =~ m!^$var/!)
$var是二维散列$a中的一个键,是另一个散列中的一个键。
这些表达的含义是什么?
回答
这是一个正则表达式(“regex”),其中!字符用作模式的定界符,该模式将在通过=~运算符( 此处为$a†)绑定到的字符串中匹配。
可以考虑使用通常的分隔符代替相同的正则表达式,$a =~ /^$var//(然后m可以省略);但现在任何/在模式中使用的显然都必须转义。为了避免这种难看和嘈杂的/组合,人们经常使用另一个字符作为分隔符,因为几乎可以使用任何字符(我最喜欢的是卷曲,m{^$var/})。‡ §
问题中的这个正则表达式测试变量中的值是否$a以(通过^锚点)变量的值开始,$var然后是/(评估变量并使用结果)。§
†不是变量名的好选择,因为$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/}.
不这样做也会导致注入错误。感谢池上对此发表评论。