繁体   English   中英

简化perl map和grep

[英]simplifying perl map and grep

我需要在某个集合的所有行中找到一个特定的子文本,而我最终得到了这一点:

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

哪个工作正常。 但是开始时的那个grep(在不发生匹配时消除所有的emty行)看起来很可怕。

有没有更干净的方法可以做到这一点?

为了澄清,这是示例输入和没有grep的输出:

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

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

想要的输出:

found: matches
found: more

上面的输出:

found:
found: matches
found:
found: more

在地图中返回()不会在输出中添加任何元素,因此您可以使用三元条件

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

但是m/...(...).../已经在比赛中返回了一个非空列表,否则返回了一个空列表,所以我想你可以说

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

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

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

这不等于简单一些:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM