2017-10-17 29 views
0

grep的Perl中给了我所有的正则表达式匹配的行。模仿linux的grep的-w在Perl的grep

为前

{ 
    my @FAMILY_MAP= ("A2LVLX","LVLX","O2LVLX"); 
    my $search="LVLX"; 
    my @match = grep (/ALVL/, @FAMILY_MAP); 
    print @match; 
} 

这里我预期的输出是LVLX但我得到的所有阵列中的三个要素。 Linux终端中的预期行为(如果grep LVLX在包含三个单词的文件上完成)。但我必须在终端中使用grep -w“LVLX”才能将LVLX作为输出。 我需要一种使用perl grep来复制相同的方法。任何提示?

+2

您的描述与您的代码不匹配 - 它不会产生任何输出,因为没有任何输入字符串匹配'/ ALVL /'。请更新一个或另一个以使它们一致。 –

+1

请注意ALLCAPS变量名通常保留给Perl中的变量或全局变量。 – simbabque

回答

5

grep -w只有当它表现为一个全字匹配字符串。为此,您需要在正则表达式中使用字边界(\b)转义序列。

my @family_map = ("A2LVLX","LVLX","O2LVLX"); 
my $search = 'LVLX'; 
my @match = grep (/\b$search\b/, @family_map); 
print "@match"; 

更新:或者,如果你知道你的数组中的元素都将是个人的话,那么就使用eq

my @match = grep($_ eq $search, @family_map); 
+1

我在想我应该阅读文档,我确定我的文档不太正确......;) – simbabque

1

如果你想完全匹配,你需要告诉它。你的模式/LVLX/匹配包含模式的字符串,因为你没有锚定它。

有两种方法可以做到这一点。要么你锚你的模式是这样

my @match = grep(/^ALVL$/, @FAMILY_MAP); 

,或者你使用的grep块形式,做一个平等的检查,这是中老年皮尔斯更快(很新皮尔斯有这样的优化,但我不记得在版本被引入)

my @match = grep { $_ eq 'ALVL' } @FAMILY_MAP; 

两者都会给你相同的输出。