0

我有一个关于 Perl 正则表达式的奇怪用法的问题。
代码在这里:

$pattern = "some_pattern";  
while (<FH>)  
{
    if (m/^\s*{\s*$pattern\s*,/ .. /^[^%]*}\./)
    {    
         ## blablabla
    }    
}  

filehandle(FH) 中的内容类似于:

{mns_host, 'dls2304-1', 1, 8}.    % ConTest
{mns_host, 'dls2304-2', 2, 10}.   % ConTest

{gn_c_ip_addresses, 1, '10.138.97.96', 27, undefined, 0}.    % ConTest
{gn_c_ip_addresses, 2, '10.138.99.32', 27, undefined, 0}.    % ConTest

{gn_router_list, false, ['10.136.64.98']}.  % ConTest

我对表达感到困惑:m/^\s*{\s*$pattern\s*,/ .. /^[^%]*}\./,尤其是的用法/ .. /,这个表达是什么意思?
你能帮助我吗?先感谢您


阮兄

4

3 回答 3

2

不,正则表达式在/. 有问题的三个运营商

  • 匹配运算符#1:m/^\s*{\s*$pattern\s*,/
  • 匹配运算符#2:/^[^%]*}\./
  • 两者都是触发器运算符的操作数,EXPR .. EXPR.

只要它的 LHS 返回 false,触发器运算符就会返回 false。一旦它的 LHS 返回 true,只要它的 RHS 返回 true,触发器就会返回 true。

佩洛普

于 2013-05-31T05:14:23.760 回答
2

,..在标量上下文中(如您的示例代码中使用的)是一个触发器运算符。 佩洛普说:

在标量上下文中,“..”返回一个布尔值。该运算符是双稳态的,就像一个触发器,并模拟 sed、awk 和各种编辑器的行范围(逗号)运算符。每个“..”运算符都维护自己的布尔状态,即使在调用包含它的子例程时也是如此。只要它的左操作数是假的,它就是假的。一旦左操作数为真,范围运算符保持真,直到右操作数为真,之后范围运算符再次变为假。

在您的使用中,一旦左侧的正则表达式匹配,触发器运算符就会翻转为真,您的if()陈述就会变为真。它在每次迭代中保持正确,直到正确的正则表达式匹配之后。然后它翻转为假,并保持这种状态,直到左侧的正则表达式在未来的某个迭代中再次匹配。

于 2013-05-31T05:14:53.100 回答
0

..范围运算符。来自Perl 文档

在标量上下文中,“..”返回一个布尔值。该运算符是双稳态的,就像一个触发器,并模拟 sed、awk 和各种编辑器的行范围(逗号)运算符。每个“..”运算符都维护自己的布尔状态,即使在调用包含它的子例程时也是如此。只要它的左操作数是假的,它就是假的。一旦左操作数为真,范围运算符保持真,直到右操作数为真,之后范围运算符再次变为假。

在这种情况下,范围运算符的两个参数是两个匹配正则表达式。

m/^\s*{\s*$pattern\s*,/

/^[^%]*}\./
于 2013-05-31T05:14:59.077 回答