首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在perl grep中模拟linux grep -w

在perl grep中模拟linux grep -w
EN

Stack Overflow用户
提问于 2017-10-17 12:32:47
回答 2查看 215关注 0票数 0

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

对前-

代码语言:javascript
复制
{
    my @FAMILY_MAP= ("A2LVLX","LVLX","O2LVLX");
    my $search="LVLX";
    my @match = grep (/ALVL/, @FAMILY_MAP);
    print @match;
 }

这里,我的预期输出是LVLX,但我得到数组中的所有三个元素。这也是Linux终端中预期的行为(如果grep是在包含这三个单词的文件上完成的)。但是我必须使用终端中的grep -w " LVLX“来获得LVLX作为输出。我需要一种使用perl复制相同内容的方法。有什么暗示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-17 12:40:16

只有当字符串显示为一个完整的单词时,grep -w才会匹配它。为此,您需要在regex中使用单词边界(\b)转义序列。

代码语言:javascript
复制
my @family_map = ("A2LVLX","LVLX","O2LVLX");
my $search = 'LVLX';
my @match = grep (/\b$search\b/, @family_map);
print "@match";

更新:或者,如果您知道数组中的元素都是单独的单词,那么只需使用eq

代码语言:javascript
复制
my @match = grep( $_ eq $search, @family_map);
票数 6
EN

Stack Overflow用户

发布于 2017-10-17 12:36:15

如果你想要一个精确的匹配,你需要告诉它。您的模式/LVLX/匹配包含该模式的字符串,因为您还没有锚定它。

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

代码语言:javascript
复制
my @match = grep(/^ALVL$/, @FAMILY_MAP);

或者您使用grep的块形式并执行等式检查,这在旧的Perl中更快(非常新的Perl已经优化了此操作,但我不记得是在哪个版本中引入的)

代码语言:javascript
复制
my @match = grep { $_ eq 'ALVL' } @FAMILY_MAP;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46790226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档