是什么意思"依次为LIST中的每个项目设置$ _"在perl函数中返回一个标量?

时间:2016-01-05 02:00:53

标签: perl iterator

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等。

3 个答案:

答案 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;