Arrays 新'的行为;每个@array';在标量上下文中

Arrays 新'的行为;每个@array';在标量上下文中,arrays,perl,iteration,new-operator,Arrays,Perl,Iteration,New Operator,Perl 5.14为我们提供了扩展的每个函数,该函数在数组和散列上运行: 在列表上下文中调用时,返回一个由两个元素组成的列表,其中包含哈希的下一个元素的键和值,或数组的下一个元素的索引和值,以便可以对其进行迭代。在标量上下文中调用时,只返回散列中的键(而不是值)或数组中的索引 使用列表上下文的示例如下: perl -E 'say $^V' v5.14.0 perl -E '@a = (1..10); while (my ($i, $elem) = each @a) {say "\$a[$i]

Perl 5.14为我们提供了扩展的
每个
函数,该函数在数组和散列上运行:

在列表上下文中调用时,返回一个由两个元素组成的列表,其中包含哈希的下一个元素的键和值,或数组的下一个元素的索引和值,以便可以对其进行迭代。在标量上下文中调用时,只返回散列中的键(而不是值)或数组中的索引

使用列表上下文的示例如下:

perl -E 'say $^V'

v5.14.0

perl -E '@a = (1..10); while (my ($i, $elem) = each @a) {say "\$a[$i] = $elem"}'

$a[0] = 1
$a[1] = 2
$a[2] = 3
$a[3] = 4
$a[4] = 5
$a[5] = 6
$a[6] = 7
$a[7] = 8
$a[8] = 9
$a[9] = 10
但是在标量上下文中,我什么也得不到:

perl -E '@a = (1..10); while (my $i = each @a) {say $i}'
有人能提供一些见解吗?我有一种感觉,当有人指出我的错误时,这将是一种打击,但也许不是

编辑:实际上,
while
循环与此无关:

perl -E '@a = (1..10); $i = each @array; say $i'
也没有输出<代码>s'@array'@a'
oops

编辑2:

根据daxim的评论:

perl -MDevel::Peek -E'@a = (1..10); Dump each @a'

SV = IV(0x161ce58) at 0x161ce68
  REFCNT = 1
  FLAGS = (TEMP,IOK,pIOK)
  IV = 0
然而,我不知道这告诉了我什么

编辑3:


循环退出似乎是因为第一个索引是
0
,或者是false。我已经提交了一个bug(),因为这似乎不是期望的行为

您需要执行
while(defined(my$i=each@array)){say$i}
否则它将在第一个索引(0)处停止,因为它是false。

[此帖子的内容是错误的。我的测试中一定有错误。我不会删除它,因为有好的评论。]

scalar每个%hash
都可以工作,因为每个hash都有一个与之关联的迭代器。我怀疑这样的迭代器没有添加到数组中

这是一个bug,正如
每个
所说:

在标量上下文中调用时,只返回散列中的键(而不是值)或数组中的索引。
请使用
perlbug

提交报告,添加
perl-MDevel::Peek-E'@a=(1..10)的输出;转储每个@a'
以获得提示。@daxim,感谢您向我介绍
Devel::Peek
,它看起来非常有用!这是有道理的,但不幸的是很麻烦!为什么不
perl-E'@a=(1..10)$i=每个@数组;说$i'
工作吗?因为您正在设置@a,但正在查询@array?不过,您让我怀疑了一下自己,因为我刚刚将它复制/粘贴到我的终端;)如果我提交一个特性请求,在数组的第一个元素上返回
each@a
但返回
0但为true
(假设数组有任何元素),您会怎么想?请参阅我对ikegami回答的评论的评论。我认为错误在于数组没有隐式定义(),而散列有隐式定义()。因为如果没有明确定义,就立即停止数组,这对我来说不是一个有效的特性,而且看起来确实像一个bug。正如phaylon所回答的,它工作得很好,迭代器就在那里。不幸的是,第一个索引
0
,是false,因此
while
迭代器将终止。这真的很不幸,我希望能够轻松地迭代数组索引,而迭代定义是一种不同的方法,如果更好一些的话。也许
each@array
可以在第一个索引上返回备受诟病的
0但为true
?我很乐意提交该功能请求。。。。这将是我相信的“最少的混淆”
perl-MO=Deparse-E'…”
告诉我
while(my$I=each%h)
被定义为
while(defined(my$I=each%h))
,但对于数组则不是这样。所以,是的,这可能是你想要处理的事情@p5p.perlbug sent(我的第一个!)!