关于Perl Regex的用法

时间:2013-05-31 05:08:29

标签: regex perl

我对Perl正则表达式的奇怪用法有疑问 代码在这里:

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

文件句柄(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*,/ .. /^[^%]*}\./感到困惑,特别是/ .. /的用法,这表示什么意思?
你能帮助我吗? 提前谢谢

BRS,

3 个答案:

答案 0 :(得分:2)

不,正则表达式在/之前结束。有三个运营商有问题

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

只要LHS返回false,触发器操作符就会返回false。一旦其LHS返回true,只要其RHS返回true,触发器就返回true。

perlop

答案 1 :(得分:2)

标量上下文中的..(在示例代码中使用)是触发器操作符。 perlop说:

  

在标量上下文中,&#34; ..&#34;返回一个布尔值。运营商是   双稳态,如触发器,并模拟行范围(逗号)   sed,awk和各种编辑的运营商。每个&#34; ..&#34;操作者   即使在调用子例程时,它也会保持自己的布尔状态   包含它。只要其左操作数为假,它就是假的。   一旦左操作数为真,范围运算符将保持为真,直到   右操作数为true,范围运算符变为false   试。

在你的用法中,一旦左边的正则表达式匹配,触发器操作符翻转为true,你的if()语句变为真。在每次迭代之后,它仍然是正确的,直到右边的正则表达式匹配为止。然后它翻转为false,并保持这种状态,直到左边的regexp在将来的迭代中再次匹配。

答案 2 :(得分:0)

..是范围运算符。来自Perl docs

  

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

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

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

/^[^%]*}\./