我需要在某些集合的所有行中找到一个特定的子文本,我最终得到了这个:
my @missing = grep { $_ ne '' } map { $1 if m/^prefix:\s+(.+):\s+suffix$/ } @lines;
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.但是那个开头的grep(为了摆脱比赛没有发生的所有空情线)看起来很糟糕.
这样做有更干净的方法吗?
只是为了澄清,这里是示例输入和没有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;
Run Code Online (Sandbox Code Playgroud)
需要输出:
found: matches
found: more
Run Code Online (Sandbox Code Playgroud)
输出得到以上:
found:
found: matches
found:
found: more
Run Code Online (Sandbox Code Playgroud)
()在地图中返回不会向输出添加任何元素,因此您可以使用三元条件
my @missing = map { m/^prefix:\s+(.+):\s+suffix$/ ? $1 : () } @lines;
Run Code Online (Sandbox Code Playgroud)
但是m/...(...).../已经在匹配上返回一个非空列表,否则返回一个空列表,所以我想你可以这么说
my @missing = map { m/^prefix:\s+(.+):\s+suffix$/ } @lines;
Run Code Online (Sandbox Code Playgroud)