2016-01-13 73 views
0

得到精确匹配,我匹配2个数组的内容是这样的:的Perl:从grep的

foreach $headerLine(@headerLines) 
{ 
    if (grep { $headerLine =~ /$_/} @filterLines) 
    { 
     #do something 
    } 
} 

我在这里需要一个确切的匹配,但^$_$不起作用。我该如何解决它?

+1

也许,你需要通过前面的反斜线逃避'$''\ $'逐字匹配,因为'$'是特殊的意义正则表达式 – Tushar

+2

@Tushar,不,可变插值在正则表达式中工作。转义它将停止变量插值的工作。 – 2016-01-13 10:47:37

回答

7

如果您想要完全匹配,则不需要正则表达式。

if (grep { $headerLine eq $_ } @filterLines) 
{ 
    #do something 
} 

你原来的问题很可能是$_有特殊的正则表达式字符,这些字符将被视为正则表达式的语法,而不是符合这些文字字符。例如,如果$_...它将匹配任何三个字符,而不是确切字符串...。如果变量不包含有效的正则表达式语法(例如$_ = '('),这也可能导致错误。

你可以绕过这与\Q...\E报价字面结构:

if (grep { $headerLine =~ /^\Q$_\E$/} @filterLines) 
{ 
    #do something 
} 
+0

谢谢。这很有帮助。我想知道如何在这种情况下使用端锚。 '/ $ _ $ /'不起作用。 –

+0

@AnupamaG,定义“不起作用”。 – 2016-01-14 05:58:27

+0

我的意思是它不作为行结束符。例如,它也会匹配“能量”和“能量_g” - 而我希望它只匹配前者。 –