perl - 当我只期待一个匹配时,我可以将 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 的所有问题混为一谈。
解决方案
您可以通过分配给列表上下文中的标量来捕获单个匹配项
($regular) = map(/^regular\.roll (.*)$/, @lines);
左侧的括号很重要,否则您将在右侧大小上施加标量上下文,结果将是其他内容,例如元素的数量。
如果您尝试从grep
( 但不是map
) 捕获第一个匹配项,并且您更习惯使用 Perl 模块,first
则包中的函数List::Util
返回第一个匹配项,并且比调用grep
和丢弃所有额外的匹配项更有效。
use List::Util 'first';
...
$regular = first { /pattern/ } @input;
推荐阅读
- c++ - 由.app执行时QFile不起作用 - Macosx
- typescript - 使用必需和部分类型
- assembly - MIPS 如何计算大于 1.111 x2^1023 的数字?
- reactjs - Office UI Fabric TextField 焦点/光标问题
- oracle - SQL 块中的语句引发完整性约束,但不是作为单个语句
- dax - 如何在 DAX 中添加度量?
- persian - 将 processmaker cartable 中的日期更改为波斯语 (jalali) 日期视图
- python - 根据成本和时间计算概率
- gnuplot - 如何更改线图的颜色?
- android - 使用 Room 实时查询进行生命周期状态管理