Perl List::MoreUtils文档说明函数001010000011100101
"依次为LIST中的每个项设置$ _"。
这使它听起来像一个迭代器,但我认为无法使用它。 E.G。
true
打印18。
在列表模式下尝试,就好像它是grep:
use List::AllUtils qw(first any true);
@strings = `dir`;
printf "%i item(s) start with 1", true { substr($_,0,1) eq '1' } @strings;
仍然只返回一个整数。
如果无法检索单个匹配项,那么@ones = true { substr($_,0,1) eq '1' } @strings;
的评论是什么意思?
同样的注释用于许多其他返回标量的List :: Util和List :: MoreUtils函数,例如$_
,all
等。
答案 0 :(得分:0)
手册中的complete definition说明:
true BLOCK LIST
计算LIST中BLOCK标准的元素数 是真的。依次为LIST中的每个项目设置
$_
printf "%i item(s) are defined", true { defined($_) } @list;
所以它确实会产生一个标量,代表来自的元素数量
LIST ,其中 BLOCK 的内容为true。每个元素都是
分配给$_
并执行 BLOCK 中的代码。如果结果
是的,它会增加内部计数;直到整个清单
完成并返回真实结果的总和。
答案 1 :(得分:0)
$ _是"当前上下文的值" ...在您的示例中,执行该块时,$ _设置为来自@strings的每个元素。
然后测试" 1"的相等性。所以块的输出是一个列表(可能包含18个元素),每个元素只有" 1"在每个项目中。然后仅过滤真值 - 其中所有值都为真 - 这将导致真元素的标量计数(又称18)。
看起来你可能需要" schwartzian变换" - 每次迭代可以捕获元组(而不是单个值),这可以允许您的打印访问$ _...的每个值,但它也需要" for"或类似的。
答案 2 :(得分:0)
我认为如果你想获得列表的匹配元素,不要使用这个List :: AllUtils,只需使用perl' grep' builtin(与grep命令行程序不同)。
像这样的东西
my @matches = grep { substr($_,0,1) eq '1' } @strings;
my $num_matches = @matches;