【问题标题】:mimic linux grep -w in perl grep在 perl grep 中模仿 linux grep -w
【发布时间】:2017-10-17 12:32:47
【问题描述】:

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 复制相同内容的方法。有什么提示吗?

【问题讨论】:

  • 您的描述与您的代码所做的不匹配 - 它不会产生任何输出,因为没有任何输入字符串匹配 /ALVL/。请更新其中一项以使其符合要求。
  • 请注意,按照约定,ALLCAPS 变量名是为 Perl 中的包变量或全局变量保留的。

标签: linux perl


【解决方案1】:

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);

【讨论】:

  • 我在想我应该阅读文档,但我确信我的不太正确...... ;)
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多