perl - 当我只期待一个匹配时,我可以将 grep(或 map)限制为第一个匹配吗?

标签 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);

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

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

最佳答案

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

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

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

如果您试图从 grep 捕获第一个匹配项(但不是 map )并且您更喜欢使用 Perl 模块,first List::Util 中的函数package 返回第一个匹配,并且比调用 grep 更有效并丢弃所有额外的匹配项。
use List::Util 'first';
...
$regular = first { /pattern/ } @input;

关于perl - 当我只期待一个匹配时,我可以将 grep(或 map)限制为第一个匹配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57779957/

相关文章:

perl - 我可以从 Perl 捕获 shell 调用吗?

perl - 在 Perl 字符串中保留反斜杠

regex - shell 或正则表达式中 "match everything but these strings"的最紧凑版本是什么?

file - 如何在文件中找到不可打印的字符?

git - 如何grep git diff?

Perl:使用 5.##.# 中包含什么?

perl - 计算数组中的唯一值不起作用

perl - 无法修改子例程内的匿名哈希引用

bash - 递归 Grep 仅显示总匹配数

python - 快速多行正则表达式查找/替换\r和\n