首页 > 解决方案 > 当我只期待一个匹配时,我可以将 grep(或 map)限制为第一个匹配吗?

问题描述

我真的是 Perl 的新手。我有以下...

#!/usr/bin/perl

#config file
$config = "$ENV{'HOME'}/.config/.wallpaperrc";

open my $handle, '<', $config;
chomp(my @lines = <$handle>);
close $handle;

@regular = map(/^regular\.roll (.*)$/, @lines);

print(@regular);

它有效,但是当我只期待一场比赛并且只想要一场比赛时,使用数组似乎很尴尬和不合适。如果我制作 @regular 标量,则该函数将返回匹配的数量。

我试图寻找答案,但结果与在 Bash 中使用 Perl grep 的所有问题混为一谈。

标签: perlgrep

解决方案


您可以通过分配给列表上下文中的标量来捕获单个匹配项

($regular) = map(/^regular\.roll (.*)$/, @lines);

左侧的括号很重要,否则您将在右侧大小上施加标量上下文,结果将是其他内容,例如元素的数量。

如果您尝试从grep( 但不是map) 捕获第一个匹配项,并且您更习惯使用 Perl 模块,first则包中的函数List::Util返回第一个匹配项,并且比调用grep和丢弃所有额外的匹配项更有效。

use List::Util 'first';
...
$regular = first { /pattern/ } @input;

推荐阅读