1#!./perl 2 3print "1..80\n"; 4 5for ($i = 0; $i <= 10; $i++) { 6 $x[$i] = $i; 7} 8$y = $x[10]; 9print "#1 :$y: eq :10:\n"; 10$y = join(' ', @x); 11print "#1 :$y: eq :0 1 2 3 4 5 6 7 8 9 10:\n"; 12if (join(' ', @x) eq '0 1 2 3 4 5 6 7 8 9 10') { 13 print "ok 1\n"; 14} else { 15 print "not ok 1\n"; 16} 17 18$i = $c = 0; 19for (;;) { 20 $c++; 21 last if $i++ > 10; 22} 23if ($c == 12) {print "ok 2\n";} else {print "not ok 2\n";} 24 25$foo = 3210; 26@ary = (1,2,3,4,5); 27foreach $foo (@ary) { 28 $foo *= 2; 29} 30if (join('',@ary) eq '246810') {print "ok 3\n";} else {print "not ok 3\n";} 31 32for (@ary) { 33 s/(.*)/ok $1\n/; 34} 35 36print $ary[1]; 37 38# test for internal scratch array generation 39# this also tests that $foo was restored to 3210 after test 3 40for (split(' ','a b c d e')) { 41 $foo .= $_; 42} 43if ($foo eq '3210abcde') {print "ok 5\n";} else {print "not ok 5 $foo\n";} 44 45foreach $foo (("ok 6\n","ok 7\n")) { 46 print $foo; 47} 48 49sub foo { 50 for $i (1..5) { 51 return $i if $_[0] == $i; 52 } 53} 54 55print foo(1) == 1 ? "ok" : "not ok", " 8\n"; 56print foo(2) == 2 ? "ok" : "not ok", " 9\n"; 57print foo(5) == 5 ? "ok" : "not ok", " 10\n"; 58 59sub bar { 60 return (1, 2, 4); 61} 62 63$a = 0; 64foreach $b (bar()) { 65 $a += $b; 66} 67print $a == 7 ? "ok" : "not ok", " 11\n"; 68 69$loop_count = 0; 70for ("-3" .. "0") { 71 $loop_count++; 72} 73print $loop_count == 4 ? "ok" : "not ok", " 12\n"; 74 75# modifying arrays in loops is a no-no 76@a = (3,4); 77eval { @a = () for (1,2,@a) }; 78print $@ =~ /Use of freed value in iteration/ ? "ok" : "not ok", " 13\n"; 79 80# [perl #30061] double destory when same iterator variable (eg $_) used in 81# DESTROY as used in for loop that triggered the destroy 82 83{ 84 85 my $x = 0; 86 sub X::DESTROY { 87 my $o = shift; 88 $x++; 89 1 for (1); 90 } 91 92 my %h; 93 $h{foo} = bless [], 'X'; 94 delete $h{foo} for $h{foo}, 1; 95 print $x == 1 ? "ok" : "not ok", " 14 - double destroy, x=$x\n"; 96} 97 98# A lot of tests to check that reversed for works. 99my $test = 14; 100sub is { 101 my ($got, $expected, $name) = @_; 102 ++$test; 103 if ($got eq $expected) { 104 print "ok $test # $name\n"; 105 return 1; 106 } 107 print "not ok $test # $name\n"; 108 print "# got '$got', expected '$expected'\n"; 109 return 0; 110} 111 112@array = ('A', 'B', 'C'); 113for (@array) { 114 $r .= $_; 115} 116is ($r, 'ABC', 'Forwards for array'); 117$r = ''; 118for (1,2,3) { 119 $r .= $_; 120} 121is ($r, '123', 'Forwards for list'); 122$r = ''; 123for (map {$_} @array) { 124 $r .= $_; 125} 126is ($r, 'ABC', 'Forwards for array via map'); 127$r = ''; 128for (map {$_} 1,2,3) { 129 $r .= $_; 130} 131is ($r, '123', 'Forwards for list via map'); 132 133$r = ''; 134for (reverse @array) { 135 $r .= $_; 136} 137is ($r, 'CBA', 'Reverse for array'); 138$r = ''; 139for (reverse 1,2,3) { 140 $r .= $_; 141} 142is ($r, '321', 'Reverse for list'); 143$r = ''; 144for (reverse map {$_} @array) { 145 $r .= $_; 146} 147is ($r, 'CBA', 'Reverse for array via map'); 148$r = ''; 149for (reverse map {$_} 1,2,3) { 150 $r .= $_; 151} 152is ($r, '321', 'Reverse for list via map'); 153 154$r = ''; 155for my $i (@array) { 156 $r .= $i; 157} 158is ($r, 'ABC', 'Forwards for array with var'); 159$r = ''; 160for my $i (1,2,3) { 161 $r .= $i; 162} 163is ($r, '123', 'Forwards for list with var'); 164$r = ''; 165for my $i (map {$_} @array) { 166 $r .= $i; 167} 168is ($r, 'ABC', 'Forwards for array via map with var'); 169$r = ''; 170for my $i (map {$_} 1,2,3) { 171 $r .= $i; 172} 173is ($r, '123', 'Forwards for list via map with var'); 174 175$r = ''; 176for my $i (reverse @array) { 177 $r .= $i; 178} 179is ($r, 'CBA', 'Reverse for array with var'); 180$r = ''; 181for my $i (reverse 1,2,3) { 182 $r .= $i; 183} 184is ($r, '321', 'Reverse for list with var'); 185$r = ''; 186for my $i (reverse map {$_} @array) { 187 $r .= $i; 188} 189is ($r, 'CBA', 'Reverse for array via map with var'); 190$r = ''; 191for my $i (reverse map {$_} 1,2,3) { 192 $r .= $i; 193} 194is ($r, '321', 'Reverse for list via map with var'); 195 196# For some reason the generate optree is different when $_ is implicit. 197$r = ''; 198for $_ (@array) { 199 $r .= $_; 200} 201is ($r, 'ABC', 'Forwards for array with explicit $_'); 202$r = ''; 203for $_ (1,2,3) { 204 $r .= $_; 205} 206is ($r, '123', 'Forwards for list with explicit $_'); 207$r = ''; 208for $_ (map {$_} @array) { 209 $r .= $_; 210} 211is ($r, 'ABC', 'Forwards for array via map with explicit $_'); 212$r = ''; 213for $_ (map {$_} 1,2,3) { 214 $r .= $_; 215} 216is ($r, '123', 'Forwards for list via map with explicit $_'); 217 218$r = ''; 219for $_ (reverse @array) { 220 $r .= $_; 221} 222is ($r, 'CBA', 'Reverse for array with explicit $_'); 223$r = ''; 224for $_ (reverse 1,2,3) { 225 $r .= $_; 226} 227is ($r, '321', 'Reverse for list with explicit $_'); 228$r = ''; 229for $_ (reverse map {$_} @array) { 230 $r .= $_; 231} 232is ($r, 'CBA', 'Reverse for array via map with explicit $_'); 233$r = ''; 234for $_ (reverse map {$_} 1,2,3) { 235 $r .= $_; 236} 237is ($r, '321', 'Reverse for list via map with explicit $_'); 238 239# I don't think that my is that different from our in the optree. But test a 240# few: 241$r = ''; 242for our $i (reverse @array) { 243 $r .= $i; 244} 245is ($r, 'CBA', 'Reverse for array with our var'); 246$r = ''; 247for our $i (reverse 1,2,3) { 248 $r .= $i; 249} 250is ($r, '321', 'Reverse for list with our var'); 251$r = ''; 252for our $i (reverse map {$_} @array) { 253 $r .= $i; 254} 255is ($r, 'CBA', 'Reverse for array via map with our var'); 256$r = ''; 257for our $i (reverse map {$_} 1,2,3) { 258 $r .= $i; 259} 260is ($r, '321', 'Reverse for list via map with our var'); 261 262 263$r = ''; 264for (1, reverse @array) { 265 $r .= $_; 266} 267is ($r, '1CBA', 'Reverse for array with leading value'); 268$r = ''; 269for ('A', reverse 1,2,3) { 270 $r .= $_; 271} 272is ($r, 'A321', 'Reverse for list with leading value'); 273$r = ''; 274for (1, reverse map {$_} @array) { 275 $r .= $_; 276} 277is ($r, '1CBA', 'Reverse for array via map with leading value'); 278$r = ''; 279for ('A', reverse map {$_} 1,2,3) { 280 $r .= $_; 281} 282is ($r, 'A321', 'Reverse for list via map with leading value'); 283 284$r = ''; 285for (reverse (@array), 1) { 286 $r .= $_; 287} 288is ($r, 'CBA1', 'Reverse for array with trailing value'); 289$r = ''; 290for (reverse (1,2,3), 'A') { 291 $r .= $_; 292} 293is ($r, '321A', 'Reverse for list with trailing value'); 294$r = ''; 295for (reverse (map {$_} @array), 1) { 296 $r .= $_; 297} 298is ($r, 'CBA1', 'Reverse for array via map with trailing value'); 299$r = ''; 300for (reverse (map {$_} 1,2,3), 'A') { 301 $r .= $_; 302} 303is ($r, '321A', 'Reverse for list via map with trailing value'); 304 305 306$r = ''; 307for $_ (1, reverse @array) { 308 $r .= $_; 309} 310is ($r, '1CBA', 'Reverse for array with leading value with explicit $_'); 311$r = ''; 312for $_ ('A', reverse 1,2,3) { 313 $r .= $_; 314} 315is ($r, 'A321', 'Reverse for list with leading value with explicit $_'); 316$r = ''; 317for $_ (1, reverse map {$_} @array) { 318 $r .= $_; 319} 320is ($r, '1CBA', 321 'Reverse for array via map with leading value with explicit $_'); 322$r = ''; 323for $_ ('A', reverse map {$_} 1,2,3) { 324 $r .= $_; 325} 326is ($r, 'A321', 'Reverse for list via map with leading value with explicit $_'); 327 328$r = ''; 329for $_ (reverse (@array), 1) { 330 $r .= $_; 331} 332is ($r, 'CBA1', 'Reverse for array with trailing value with explicit $_'); 333$r = ''; 334for $_ (reverse (1,2,3), 'A') { 335 $r .= $_; 336} 337is ($r, '321A', 'Reverse for list with trailing value with explicit $_'); 338$r = ''; 339for $_ (reverse (map {$_} @array), 1) { 340 $r .= $_; 341} 342is ($r, 'CBA1', 343 'Reverse for array via map with trailing value with explicit $_'); 344$r = ''; 345for $_ (reverse (map {$_} 1,2,3), 'A') { 346 $r .= $_; 347} 348is ($r, '321A', 349 'Reverse for list via map with trailing value with explicit $_'); 350 351$r = ''; 352for my $i (1, reverse @array) { 353 $r .= $i; 354} 355is ($r, '1CBA', 'Reverse for array with leading value and var'); 356$r = ''; 357for my $i ('A', reverse 1,2,3) { 358 $r .= $i; 359} 360is ($r, 'A321', 'Reverse for list with leading value and var'); 361$r = ''; 362for my $i (1, reverse map {$_} @array) { 363 $r .= $i; 364} 365is ($r, '1CBA', 'Reverse for array via map with leading value and var'); 366$r = ''; 367for my $i ('A', reverse map {$_} 1,2,3) { 368 $r .= $i; 369} 370is ($r, 'A321', 'Reverse for list via map with leading value and var'); 371 372$r = ''; 373for my $i (reverse (@array), 1) { 374 $r .= $i; 375} 376is ($r, 'CBA1', 'Reverse for array with trailing value and var'); 377$r = ''; 378for my $i (reverse (1,2,3), 'A') { 379 $r .= $i; 380} 381is ($r, '321A', 'Reverse for list with trailing value and var'); 382$r = ''; 383for my $i (reverse (map {$_} @array), 1) { 384 $r .= $i; 385} 386is ($r, 'CBA1', 'Reverse for array via map with trailing value and var'); 387$r = ''; 388for my $i (reverse (map {$_} 1,2,3), 'A') { 389 $r .= $i; 390} 391is ($r, '321A', 'Reverse for list via map with trailing value and var'); 392 393 394$r = ''; 395for (reverse 1, @array) { 396 $r .= $_; 397} 398is ($r, 'CBA1', 'Reverse for value and array'); 399$r = ''; 400for (reverse map {$_} 1, @array) { 401 $r .= $_; 402} 403is ($r, 'CBA1', 'Reverse for value and array via map'); 404 405$r = ''; 406for (reverse (@array, 1)) { 407 $r .= $_; 408} 409is ($r, '1CBA', 'Reverse for array and value'); 410$r = ''; 411for (reverse (map {$_} @array, 1)) { 412 $r .= $_; 413} 414is ($r, '1CBA', 'Reverse for array and value via map'); 415 416$r = ''; 417for $_ (reverse 1, @array) { 418 $r .= $_; 419} 420is ($r, 'CBA1', 'Reverse for value and array with explicit $_'); 421$r = ''; 422for $_ (reverse map {$_} 1, @array) { 423 $r .= $_; 424} 425is ($r, 'CBA1', 'Reverse for value and array via map with explicit $_'); 426 427$r = ''; 428for $_ (reverse (@array, 1)) { 429 $r .= $_; 430} 431is ($r, '1CBA', 'Reverse for array and value with explicit $_'); 432$r = ''; 433for $_ (reverse (map {$_} @array, 1)) { 434 $r .= $_; 435} 436is ($r, '1CBA', 'Reverse for array and value via map with explicit $_'); 437 438 439$r = ''; 440for my $i (reverse 1, @array) { 441 $r .= $i; 442} 443is ($r, 'CBA1', 'Reverse for value and array with var'); 444$r = ''; 445for my $i (reverse map {$_} 1, @array) { 446 $r .= $i; 447} 448is ($r, 'CBA1', 'Reverse for value and array via map with var'); 449 450$r = ''; 451for my $i (reverse (@array, 1)) { 452 $r .= $i; 453} 454is ($r, '1CBA', 'Reverse for array and value with var'); 455$r = ''; 456for my $i (reverse (map {$_} @array, 1)) { 457 $r .= $i; 458} 459is ($r, '1CBA', 'Reverse for array and value via map with var'); 460 461TODO: { 462 $test++; 463 local $TODO = "RT #1085: what should be output of perl -we 'print do { foreach (1, 2) { 1; } }'"; 464 if (do {17; foreach (1, 2) { 1; } } != 17) { 465 print "not "; 466 } 467 print "ok $test # TODO $TODO\n"; 468} 469 470TODO: { 471 $test++; 472 no warnings 'reserved'; 473 local $TODO = "RT #2166: foreach spuriously autovivifies"; 474 my %h; 475 foreach (@h{a, b}) {} 476 if(keys(%h)) { 477 print "not "; 478 } 479 print "ok $test # TODO $TODO\n"; 480} 481