如果我只希望一个匹配项,是否可以将grep(或映射)限制为第一个匹配项?

dea*_*sin 6 perl grep

我真的是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);
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是当我只期望一个匹配并且只想要一个匹配时,使用数组似乎很尴尬和不合适。如果我使用@regular标量,则该函数将返回匹配数目。

我试图搜索答案,但是在Bash中使用Perl grep的所有问题都使结果感到困惑。

mob*_*mob 6

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

($regular) = map(/^regular\.roll (.*)$/, @lines);
Run Code Online (Sandbox Code Playgroud)

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

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

use List::Util 'first';
...
$regular = first { /pattern/ } @input;
Run Code Online (Sandbox Code Playgroud)