简化 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;
我需要在某个集合的所有行中找到一段特定的潜台词,我最终得到了这个:
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;