简化 perl 映射和 grep

simplifying perl map and grep

我需要在某个集合的所有行中找到一段特定的潜台词,我最终得到了这个:

my @missing = grep { $_ ne '' } map {  if m/^prefix:\s+(.+):\s+suffix$/ } @lines;

效果很好。但是一开始的 grep(为了摆脱匹配没有发生时的所有空行)看起来很糟糕。

有更简洁的方法吗?

澄清一下,这是我在没有 grep 的情况下获得的示例输入和输出:

my @lines = (
    'drivel',
    'prefix: matches: suffix',
    'stuff',
    'prefix: more: suffix'
);

my @selected = map {  if m/^prefix:\s+(.+):\s+suffix$/ } @lines;
print "found: $_\n" foreach @selected;

想要的输出:

found: matches
found: more

以上得到的输出:

found:
found: matches
found:
found: more

这不就相当于更简单的吗:

my @missing = grep /./, map {  if m/^prefix:\s+(.+):\s+suffix$/ } @lines;

我认为您可以通过在找不到匹配项时返回空列表来 map 处理所有问题:

my @missing = map { /^prefix:\s+(.+):\s+suffix$/ ?  : () } @lines;

在映射中返回 () 不会向输出添加任何元素,因此您可以使用像

这样的三元条件
my @missing = map { m/^prefix:\s+(.+):\s+suffix$/ ?  : () } @lines;

但是 m/...(...).../ 已经 returns 一个匹配的非空列表,否则是一个空列表,所以我想你可以说

my @missing = map { m/^prefix:\s+(.+):\s+suffix$/ } @lines;