我对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,
阮
答案 0 :(得分:2)
不,正则表达式在/
之前结束。有三个运营商有问题
m/^\s*{\s*$pattern\s*,/
/^[^%]*}\./
EXPR .. EXPR
。只要LHS返回false,触发器操作符就会返回false。一旦其LHS返回true,只要其RHS返回true,触发器就返回true。
答案 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*,/
和
/^[^%]*}\./