在perl grep中模仿linux grep -w

时间:2017-10-17 12:32:48

标签: linux perl

grel in perl为我提供了所有匹配的行与正则表达式。

前 -

{
    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 个答案:

答案 0 :(得分: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 :(得分:1)

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

有两种方法可以做到这一点。你可以像这样锚定你的模式

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

或者你使用grep的块形式并进行相等检查,这在旧的Perls中更快(非常新的Perls已经优化了,但我不记得引入了哪个版本)

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

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