标量上下文中新的'each @array'的行为

Joe*_*ger 10 arrays iteration perl new-operator

Perl 5.14为我们提供了扩展each函数,它可以在数组和哈希上运行:

在列表上下文中调用时,返回一个2元素列表,其中包含散列的下一个元素的键和值,或者数组的下一个元素的索引和值,以便您可以迭代它.在标量上下文中调用时,仅返回散列中的键(不是值)或数组中的索引.

使用列表上下文的示例:

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
Run Code Online (Sandbox Code Playgroud)

但是在标量语境中,我什么都没得到:

perl -E '@a = (1..10); while (my $i = each @a) {say $i}'
Run Code Online (Sandbox Code Playgroud)

有人可以提供任何见解吗?我有一种感觉,当有人指出我的错误时,这将成为一个斩首,但也许不是.

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

perl -E '@a = (1..10); $i = each @array; say $i'
Run Code Online (Sandbox Code Playgroud)

也没有输出. s'@array'@a'哎呀.

编辑2:

根据达西姆的评论:

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

SV = IV(0x161ce58) at 0x161ce68
  REFCNT = 1
  FLAGS = (TEMP,IOK,pIOK)
  IV = 0
Run Code Online (Sandbox Code Playgroud)

但我不知道那是什么告诉我的.

编辑3:

似乎循环退出是因为第一个索引是0,或者是假.我已经提交了一个错误(http://rt.perl.org/rt3/Ticket/Display.html?id=90888),因为这似乎不是理想的行为.

pha*_*lon 10

你需要这样做,while (defined( my $i = each @array )) { say $i }它会在第一个索引(0)停止,因为它是假的.