我在Perl中看到了一些奇怪的分组行为。
以下是我的文件摘录:
nmos MNANT2(sam_1_,sam_1_,sam_1_);
nmos MNANT1(sam[0],sam[0],sam[0]);
nmos MNANT3(ovstb,ovstb,ovstb);
nmos M3(net14, VSS, in);
基本上我正在尝试匹配这些行,其中括号内的所有3个字段都相同。
尝试使用以下一个衬垫:
perl -nle 'm/(.+?\((.+?),$2,$2\).+)/ && print $1' new
它没有用,但下面的人工作正常:
perl -nle 'm/(.+?\((.+?),\2,\2\).+)/ && print $1' new
所以,我怀疑为什么$ 2没有工作,\ 2在这里运作良好? 我们不应该使用" $"对于反向引用,因为我最后使用了1美元?
而且,好的,如果" \"在任何地方都可以正常工作,我只是尝试放置\ 1,而不是像下面那样的$ 1:
perl -nle 'm/(.+?\((.+?),\2,\2\).+)/ && print \1' new
它返回以下错误:
SCALAR(0x1a49678)
SCALAR(0x1a49678)
SCALAR(0x1a49678)
我在这里从根本上缺少什么?期待专家们的了解。
答案 0 :(得分:2)
您似乎认为正则表达式模式和Perl代码是相同的语言。正则表达式模式中的a+b
不是加法,正则表达式之外的\2
不是匹配第二次捕获的指令。
perl -nle 'm/(.+?\((.+?),$2,$2\).+)/ && print $1' new
不起作用,因为在模式被编译之前$2
被插入到模式中。
perl -nle 'm/(.+?\((.+?),\2,\2\).+)/ && print $1' new
有效,因为正则表达式原子\2
的意思是“匹配第二次捕获的内容。”
perl -nle 'm/(.+?\((.+?),\2,\2\).+)/ && print \1' new
不起作用,因为\
是Perl的引用操作符。
答案 1 :(得分:1)
m//
和print
命令是由&&
加入的单独命令。
在正则表达式\2
内是对第二次捕获的反向引用,在正则表达式完成匹配后将分配给$2
变量。正则表达式之外\2
没有意义;只有$2
是可以访问的变量。有关详细信息,请参阅此处:http://perldoc.perl.org/perlretut.html#Backreferences
在阅读该链接时,请注意在Perl 5.10 \2
仍被识别后,但鼓励\g2
。这是因为\11
含糊不清。