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复制相同的方法。任何提示?
答案 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;
两者都会给你相同的输出。