You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

grep中带括号的块参数使用为何出现意外结果?

两种grep写法的差异及结果不同的原因

先看你给出的代码:

my @arr = ("hello", "world");
print scalar(grep (sub {return "hello" eq $_}, @arr)); # 返回2,不符合预期

print scalar(grep {"hello" eq $_} @arr); # 返回1,符合预期

两者的核心差异在于传给grep的参数类型:

  • 第一个写法里,你传递的是子程序引用(sub { ... })。grep遇到非代码块的参数时,会把这个参数当作"真值判断条件"——Perl中所有非空的引用都被视为真,所以数组里的每个元素都会被判定为匹配成功,最终scalar返回数组的总长度2。
  • 第二个写法用的是{}包裹的代码块,这是grep的标准用法:grep会遍历数组的每个元素,将当前元素赋值给$_,然后执行代码块里的逻辑判断,只有当"hello" eq $_成立时才保留该元素,最终匹配到1个元素,scalar返回1。

如果想通过子程序实现和代码块一样的效果,需要主动调用子程序并传入当前元素,比如:

print scalar(grep { sub {return "hello" eq $_}->($_) } @arr);
# 或者先定义子程序引用
my $match_sub = sub { return "hello" eq $_[0] };
print scalar(grep $match_sub->($_), @arr);

内容的提问来源于stack exchange,提问作者Talespin_Kit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:32:38