1b39c5158Smillert#!./perl 2b39c5158Smillert 3b39c5158SmillertBEGIN { 4b39c5158Smillert chdir 't' if -d 't'; 5b39c5158Smillert require './test.pl'; 6*9f11ffb7Safresh1 set_up_inc('../lib'); 7b39c5158Smillert} 8b39c5158Smillertuse strict; 9b39c5158Smillertuse warnings; 10*9f11ffb7Safresh1our (@array, @r, $k, $v, $c); 11b39c5158Smillert 12b8851fccSafresh1plan tests => 65; 13b39c5158Smillert 14b39c5158Smillert@array = qw(crunch zam bloop); 15b39c5158Smillert 16b39c5158Smillert(@r) = each @array; 1791f110e0Safresh1is (scalar @r, 2, "'each' on array returns index and value of next element"); 1891f110e0Safresh1is ($r[0], 0, "got expected index"); 1991f110e0Safresh1is ($r[1], 'crunch', "got expected value"); 20b39c5158Smillert($k, $v) = each @array; 2191f110e0Safresh1is ($k, 1, "got expected index of next element"); 2291f110e0Safresh1is ($v, 'zam', "got expected value of next element"); 23b39c5158Smillert($k, $v) = each @array; 2491f110e0Safresh1is ($k, 2, "got expected index of remaining element"); 2591f110e0Safresh1is ($v, 'bloop', "got expected value of remaining element"); 26b39c5158Smillert(@r) = each @array; 2791f110e0Safresh1is (scalar @r, 0, 2891f110e0Safresh1 "no elements remaining to be iterated over in original array"); 29b39c5158Smillert 30b39c5158Smillert(@r) = each @array; 3191f110e0Safresh1is (scalar @r, 2, "start second iteration over original array"); 3291f110e0Safresh1is ($r[0], 0, "got expected index"); 3391f110e0Safresh1is ($r[1], 'crunch', "got expected value"); 34b39c5158Smillert($k) = each @array; 3591f110e0Safresh1is ($k, 1, "got index when only index was assigned to variable"); 36b39c5158Smillert 37898184e3Ssthenmy @lex_array = qw(PLOP SKLIZZORCH RATTLE); 38b39c5158Smillert 39b39c5158Smillert(@r) = each @lex_array; 4091f110e0Safresh1is (scalar @r, 2, "'each' on array returns index and value of next element"); 4191f110e0Safresh1is ($r[0], 0, "got expected index"); 4291f110e0Safresh1is ($r[1], 'PLOP', "got expected value"); 43b39c5158Smillert($k, $v) = each @lex_array; 4491f110e0Safresh1is ($k, 1, "got expected index of next element"); 4591f110e0Safresh1is ($v, 'SKLIZZORCH', "got expected value of next element"); 46b39c5158Smillert($k) = each @lex_array; 4791f110e0Safresh1is ($k, 2, "got expected index of remaining element"); 48b39c5158Smillert(@r) = each @lex_array; 4991f110e0Safresh1is (scalar @r, 0, 5091f110e0Safresh1 "no elements remaining to be iterated over in original array"); 51b39c5158Smillert 52b39c5158Smillertmy $ar = ['bacon']; 53b39c5158Smillert 54b39c5158Smillert(@r) = each @$ar; 5591f110e0Safresh1is (scalar @r, 2, 5691f110e0Safresh1 "'each' on array inside reference returns index and value of next element"); 5791f110e0Safresh1is ($r[0], 0, "got expected index"); 5891f110e0Safresh1is ($r[1], 'bacon', "got expected value of array element inside reference"); 59b39c5158Smillert 60b39c5158Smillert(@r) = each @$ar; 6191f110e0Safresh1is (scalar @r, 0, 6291f110e0Safresh1 "no elements remaining to be iterated over in array inside reference"); 63b39c5158Smillert 6491f110e0Safresh1is (each @$ar, 0, "scalar context 'each' on array returns expected index"); 6591f110e0Safresh1is (scalar each @$ar, undef, 6691f110e0Safresh1 "no elements remaining to be iterated over; array reference case"); 67b39c5158Smillert 68b39c5158Smillertmy @keys; 69b39c5158Smillert@keys = keys @array; 7091f110e0Safresh1is ("@keys", "0 1 2", 7191f110e0Safresh1 "'keys' on array in list context returns list of indices"); 72b39c5158Smillert 73b39c5158Smillert@keys = keys @lex_array; 7491f110e0Safresh1is ("@keys", "0 1 2", 7591f110e0Safresh1 "'keys' on another array in list context returns list of indices"); 76b39c5158Smillert 77b39c5158Smillert($k, $v) = each @array; 7891f110e0Safresh1is ($k, 0, "got expected index"); 7991f110e0Safresh1is ($v, 'crunch', "got expected value"); 80b39c5158Smillert 81b39c5158Smillert@keys = keys @array; 8291f110e0Safresh1is ("@keys", "0 1 2", 8391f110e0Safresh1 "'keys' on array in list context returns list of indices"); 84b39c5158Smillert 85b39c5158Smillert($k, $v) = each @array; 8691f110e0Safresh1is ($k, 0, "following 'keys', got expected index"); 8791f110e0Safresh1is ($v, 'crunch', "following 'keys', got expected value"); 88b39c5158Smillert 89b39c5158Smillert 90b39c5158Smillert 91b39c5158Smillertmy @values; 92b39c5158Smillert@values = values @array; 9391f110e0Safresh1is ("@values", "@array", 9491f110e0Safresh1 "'values' on array returns list of values"); 95b39c5158Smillert 96b39c5158Smillert@values = values @lex_array; 9791f110e0Safresh1is ("@values", "@lex_array", 9891f110e0Safresh1 "'values' on another array returns list of values"); 99b39c5158Smillert 100898184e3Ssthen($k, $v) = each @array; 10191f110e0Safresh1is ($k, 0, "following 'values', got expected index"); 10291f110e0Safresh1is ($v, 'crunch', "following 'values', got expected index"); 103b39c5158Smillert 104b39c5158Smillert@values = values @array; 10591f110e0Safresh1is ("@values", "@array", 10691f110e0Safresh1 "following 'values' and 'each', 'values' continues to return expected list of values"); 107b39c5158Smillert 108898184e3Ssthen($k, $v) = each @array; 10991f110e0Safresh1is ($k, 0, 11091f110e0Safresh1 "following 'values', 'each' and 'values', 'each' continues to return expected index"); 11191f110e0Safresh1is ($v, 'crunch', 11291f110e0Safresh1 "following 'values', 'each' and 'values', 'each' continues to return expected value"); 113898184e3Ssthen 114898184e3Ssthen# reset 115898184e3Ssthenwhile (each @array) { } 116898184e3Ssthen 117898184e3Ssthen# each(ARRAY) in the conditional loop 118898184e3Ssthen$c = 0; 119898184e3Ssthenwhile (($k, $v) = each @array) { 12091f110e0Safresh1 is ($k, $c, "'each' on array in loop returns expected index '$c'"); 12191f110e0Safresh1 is ($v, $array[$k], 12291f110e0Safresh1 "'each' on array in loop returns expected value '$array[$k]'"); 123898184e3Ssthen $c++; 124b39c5158Smillert} 125b39c5158Smillert 126898184e3Ssthen# each(ARRAY) on scalar context in conditional loop 127898184e3Ssthen# should guarantee to be wrapped into defined() function. 128898184e3Ssthen# first return value will be 0 --> [#90888] 129898184e3Ssthen$c = 0; 130898184e3Ssthen$k = 0; 131898184e3Ssthen$v = 0; 132898184e3Ssthenwhile ($k = each @array) { 13391f110e0Safresh1 is ($k, $v, 13491f110e0Safresh1 "'each' on array in scalar context in loop returns expected index '$v'"); 135898184e3Ssthen $v++; 136898184e3Ssthen} 137b39c5158Smillert 138898184e3Ssthen# each(ARRAY) in the conditional loop 139898184e3Ssthen$c = 0; 140898184e3Ssthenfor (; ($k, $v) = each @array ;) { 14191f110e0Safresh1 is ($k, $c, 14291f110e0Safresh1 "'each' on array in list context in loop returns expected index '$c'"); 14391f110e0Safresh1 is ($v, $array[$k], 14491f110e0Safresh1 "'each' on array in list context in loop returns expected value '$array[$k]'"); 145898184e3Ssthen $c++; 146898184e3Ssthen} 147b39c5158Smillert 148898184e3Ssthen# each(ARRAY) on scalar context in conditional loop 149898184e3Ssthen# --> [#90888] 150898184e3Ssthen$c = 0; 151898184e3Ssthen$k = 0; 152898184e3Ssthen$v = 0; 153898184e3Ssthenfor (; $k = each(@array) ;) { 15491f110e0Safresh1 is ($k, $v, 15591f110e0Safresh1 "'each' on array in scalar context in loop returns expected index '$v'"); 156898184e3Ssthen $v++; 157898184e3Ssthen} 15891f110e0Safresh1 15991f110e0Safresh1# Reset the iterator when the array is cleared [RT #75596] 16091f110e0Safresh1{ 16191f110e0Safresh1 my @a = 'a' .. 'c'; 16291f110e0Safresh1 my ($i, $v) = each @a; 16391f110e0Safresh1 is ("$i-$v", '0-a', "got expected index and value"); 16491f110e0Safresh1 @a = 'A' .. 'C'; 16591f110e0Safresh1 ($i, $v) = each @a; 16691f110e0Safresh1 is ("$i-$v", '0-A', 16791f110e0Safresh1 "got expected new index and value after array gets new content"); 16891f110e0Safresh1} 16991f110e0Safresh1 17091f110e0Safresh1# Check that the iterator is reset when localization ends 17191f110e0Safresh1{ 17291f110e0Safresh1 @array = 'a' .. 'c'; 17391f110e0Safresh1 my ($i, $v) = each @array; 17491f110e0Safresh1 is ("$i-$v", '0-a', "got expected index and value"); 17591f110e0Safresh1 { 17691f110e0Safresh1 local @array = 'A' .. 'C'; 17791f110e0Safresh1 my ($i, $v) = each @array; 17891f110e0Safresh1 is ("$i-$v", '0-A', 17991f110e0Safresh1 "got expected new index and value after array is localized and gets new content"); 18091f110e0Safresh1 ($i, $v) = each @array; 18191f110e0Safresh1 is ("$i-$v", '1-B', 18291f110e0Safresh1 "got expected next index and value after array is localized and gets new content"); 18391f110e0Safresh1 } 18491f110e0Safresh1 ($i, $v) = each @array; 18591f110e0Safresh1 is ("$i-$v", '1-b', 18691f110e0Safresh1 "got expected next index and value upon return to pre-localized array"); 18791f110e0Safresh1 # Explicit reset 18891f110e0Safresh1 while (each @array) { } 18991f110e0Safresh1} 190b8851fccSafresh1 191b8851fccSafresh1my $a = 7; 192b8851fccSafresh1*a = sub { \@_ }->($a); 193b8851fccSafresh1($a, $b) = each our @a; 194b8851fccSafresh1is "$a $b", "0 7", 'each in list assignment'; 195b8851fccSafresh1$a = 7; 196b8851fccSafresh1($a, $b) = (3, values @a); 197b8851fccSafresh1is "$a $b", "3 7", 'values in list assignment'; 198