This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
t/harness can run the tests lib/*.t in parallel with each other.
[perl5.git] / t / cmd / for.t
CommitLineData
8d063cd8
LW
1#!./perl
2
4b70616d 3print "1..118\n";
8d063cd8
LW
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";}
378cc40b
LW
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}
a687059c 43if ($foo eq '3210abcde') {print "ok 5\n";} else {print "not ok 5 $foo\n";}
378cc40b
LW
44
45foreach $foo (("ok 6\n","ok 7\n")) {
46 print $foo;
47}
8bb77e1d
GS
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";
4bfc3f4d
JH
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
f3fd7796
SR
69$loop_count = 0;
70for ("-3" .. "0") {
71 $loop_count++;
72}
73print $loop_count == 4 ? "ok" : "not ok", " 12\n";
cccede53
DM
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";
dc09a129
DM
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
4d46db71
NC
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');
4b70616d
A
132$r = '';
133for (1 .. 3) {
134 $r .= $_;
135}
136is ($r, '123', 'Forwards for list via ..');
137$r = '';
138for ('A' .. 'C') {
139 $r .= $_;
140}
141is ($r, 'ABC', 'Forwards for list via ..');
4d46db71
NC
142
143$r = '';
144for (reverse @array) {
145 $r .= $_;
146}
147is ($r, 'CBA', 'Reverse for array');
148$r = '';
149for (reverse 1,2,3) {
150 $r .= $_;
151}
152is ($r, '321', 'Reverse for list');
153$r = '';
154for (reverse map {$_} @array) {
155 $r .= $_;
156}
157is ($r, 'CBA', 'Reverse for array via map');
158$r = '';
159for (reverse map {$_} 1,2,3) {
160 $r .= $_;
161}
162is ($r, '321', 'Reverse for list via map');
4b70616d
A
163$r = '';
164for (reverse 1 .. 3) {
165 $r .= $_;
166}
167is ($r, '321', 'Reverse for list via ..');
168$r = '';
169for (reverse 'A' .. 'C') {
170 $r .= $_;
171}
9135cc1c 172is ($r, 'CBA', 'Reverse for list via ..');
4d46db71
NC
173
174$r = '';
175for my $i (@array) {
176 $r .= $i;
177}
178is ($r, 'ABC', 'Forwards for array with var');
179$r = '';
180for my $i (1,2,3) {
181 $r .= $i;
182}
183is ($r, '123', 'Forwards for list with var');
184$r = '';
185for my $i (map {$_} @array) {
186 $r .= $i;
187}
188is ($r, 'ABC', 'Forwards for array via map with var');
189$r = '';
190for my $i (map {$_} 1,2,3) {
191 $r .= $i;
192}
193is ($r, '123', 'Forwards for list via map with var');
4b70616d
A
194$r = '';
195for my $i (1 .. 3) {
196 $r .= $i;
197}
198is ($r, '123', 'Forwards for list via .. with var');
199$r = '';
200for my $i ('A' .. 'C') {
201 $r .= $i;
202}
203is ($r, 'ABC', 'Forwards for list via .. with var');
4d46db71
NC
204
205$r = '';
206for my $i (reverse @array) {
207 $r .= $i;
208}
209is ($r, 'CBA', 'Reverse for array with var');
210$r = '';
211for my $i (reverse 1,2,3) {
212 $r .= $i;
213}
214is ($r, '321', 'Reverse for list with var');
215$r = '';
216for my $i (reverse map {$_} @array) {
217 $r .= $i;
218}
219is ($r, 'CBA', 'Reverse for array via map with var');
220$r = '';
221for my $i (reverse map {$_} 1,2,3) {
222 $r .= $i;
223}
224is ($r, '321', 'Reverse for list via map with var');
4b70616d
A
225$r = '';
226for my $i (reverse 1 .. 3) {
227 $r .= $i;
228}
229is ($r, '321', 'Reverse for list via .. with var');
230$r = '';
231for my $i (reverse 'A' .. 'C') {
232 $r .= $i;
233}
234is ($r, 'CBA', 'Reverse for list via .. with var');
4d46db71 235
4ef67d78
NC
236# For some reason the generate optree is different when $_ is implicit.
237$r = '';
238for $_ (@array) {
239 $r .= $_;
240}
241is ($r, 'ABC', 'Forwards for array with explicit $_');
242$r = '';
243for $_ (1,2,3) {
244 $r .= $_;
245}
246is ($r, '123', 'Forwards for list with explicit $_');
247$r = '';
248for $_ (map {$_} @array) {
249 $r .= $_;
250}
251is ($r, 'ABC', 'Forwards for array via map with explicit $_');
252$r = '';
253for $_ (map {$_} 1,2,3) {
254 $r .= $_;
255}
256is ($r, '123', 'Forwards for list via map with explicit $_');
4b70616d
A
257$r = '';
258for $_ (1 .. 3) {
259 $r .= $_;
260}
261is ($r, '123', 'Forwards for list via .. with var with explicit $_');
262$r = '';
263for $_ ('A' .. 'C') {
264 $r .= $_;
265}
266is ($r, 'ABC', 'Forwards for list via .. with var with explicit $_');
4ef67d78
NC
267
268$r = '';
269for $_ (reverse @array) {
270 $r .= $_;
271}
272is ($r, 'CBA', 'Reverse for array with explicit $_');
273$r = '';
274for $_ (reverse 1,2,3) {
275 $r .= $_;
276}
277is ($r, '321', 'Reverse for list with explicit $_');
278$r = '';
279for $_ (reverse map {$_} @array) {
280 $r .= $_;
281}
282is ($r, 'CBA', 'Reverse for array via map with explicit $_');
283$r = '';
284for $_ (reverse map {$_} 1,2,3) {
285 $r .= $_;
286}
287is ($r, '321', 'Reverse for list via map with explicit $_');
4b70616d
A
288$r = '';
289for $_ (reverse 1 .. 3) {
290 $r .= $_;
291}
292is ($r, '321', 'Reverse for list via .. with var with explicit $_');
293$r = '';
294for $_ (reverse 'A' .. 'C') {
295 $r .= $_;
296}
297is ($r, 'CBA', 'Reverse for list via .. with var with explicit $_');
4d46db71
NC
298
299# I don't think that my is that different from our in the optree. But test a
300# few:
301$r = '';
302for our $i (reverse @array) {
303 $r .= $i;
304}
305is ($r, 'CBA', 'Reverse for array with our var');
306$r = '';
307for our $i (reverse 1,2,3) {
308 $r .= $i;
309}
310is ($r, '321', 'Reverse for list with our var');
311$r = '';
312for our $i (reverse map {$_} @array) {
313 $r .= $i;
314}
315is ($r, 'CBA', 'Reverse for array via map with our var');
316$r = '';
317for our $i (reverse map {$_} 1,2,3) {
318 $r .= $i;
319}
320is ($r, '321', 'Reverse for list via map with our var');
4b70616d
A
321$r = '';
322for our $i (reverse 1 .. 3) {
323 $r .= $i;
324}
325is ($r, '321', 'Reverse for list via .. with our var');
326$r = '';
327for our $i (reverse 'A' .. 'C') {
328 $r .= $i;
329}
330is ($r, 'CBA', 'Reverse for list via .. with our var');
4d46db71
NC
331
332
333$r = '';
334for (1, reverse @array) {
335 $r .= $_;
336}
337is ($r, '1CBA', 'Reverse for array with leading value');
338$r = '';
339for ('A', reverse 1,2,3) {
340 $r .= $_;
341}
342is ($r, 'A321', 'Reverse for list with leading value');
343$r = '';
344for (1, reverse map {$_} @array) {
345 $r .= $_;
346}
347is ($r, '1CBA', 'Reverse for array via map with leading value');
348$r = '';
349for ('A', reverse map {$_} 1,2,3) {
350 $r .= $_;
351}
352is ($r, 'A321', 'Reverse for list via map with leading value');
4b70616d
A
353$r = '';
354for ('A', reverse 1 .. 3) {
355 $r .= $_;
356}
357is ($r, 'A321', 'Reverse for list via .. with leading value');
358$r = '';
359for (1, reverse 'A' .. 'C') {
360 $r .= $_;
361}
362is ($r, '1CBA', 'Reverse for list via .. with leading value');
4d46db71
NC
363
364$r = '';
365for (reverse (@array), 1) {
366 $r .= $_;
367}
368is ($r, 'CBA1', 'Reverse for array with trailing value');
369$r = '';
370for (reverse (1,2,3), 'A') {
371 $r .= $_;
372}
373is ($r, '321A', 'Reverse for list with trailing value');
374$r = '';
375for (reverse (map {$_} @array), 1) {
376 $r .= $_;
377}
378is ($r, 'CBA1', 'Reverse for array via map with trailing value');
379$r = '';
380for (reverse (map {$_} 1,2,3), 'A') {
381 $r .= $_;
382}
383is ($r, '321A', 'Reverse for list via map with trailing value');
4b70616d
A
384$r = '';
385for (reverse (1 .. 3), 'A') {
386 $r .= $_;
387}
388is ($r, '321A', 'Reverse for list via .. with trailing value');
389$r = '';
390for (reverse ('A' .. 'C'), 1) {
391 $r .= $_;
392}
393is ($r, 'CBA1', 'Reverse for list via .. with trailing value');
4d46db71
NC
394
395
396$r = '';
4ef67d78
NC
397for $_ (1, reverse @array) {
398 $r .= $_;
399}
400is ($r, '1CBA', 'Reverse for array with leading value with explicit $_');
401$r = '';
402for $_ ('A', reverse 1,2,3) {
403 $r .= $_;
404}
405is ($r, 'A321', 'Reverse for list with leading value with explicit $_');
406$r = '';
407for $_ (1, reverse map {$_} @array) {
408 $r .= $_;
409}
410is ($r, '1CBA',
411 'Reverse for array via map with leading value with explicit $_');
412$r = '';
413for $_ ('A', reverse map {$_} 1,2,3) {
414 $r .= $_;
415}
416is ($r, 'A321', 'Reverse for list via map with leading value with explicit $_');
4b70616d
A
417$r = '';
418for $_ ('A', reverse 1 .. 3) {
419 $r .= $_;
420}
421is ($r, 'A321', 'Reverse for list via .. with leading value with explicit $_');
422$r = '';
423for $_ (1, reverse 'A' .. 'C') {
424 $r .= $_;
425}
426is ($r, '1CBA', 'Reverse for list via .. with leading value with explicit $_');
4ef67d78
NC
427
428$r = '';
429for $_ (reverse (@array), 1) {
430 $r .= $_;
431}
432is ($r, 'CBA1', 'Reverse for array with trailing value with explicit $_');
433$r = '';
434for $_ (reverse (1,2,3), 'A') {
435 $r .= $_;
436}
437is ($r, '321A', 'Reverse for list with trailing value with explicit $_');
438$r = '';
439for $_ (reverse (map {$_} @array), 1) {
440 $r .= $_;
441}
442is ($r, 'CBA1',
443 'Reverse for array via map with trailing value with explicit $_');
444$r = '';
445for $_ (reverse (map {$_} 1,2,3), 'A') {
446 $r .= $_;
447}
448is ($r, '321A',
449 'Reverse for list via map with trailing value with explicit $_');
4b70616d
A
450$r = '';
451for $_ (reverse (1 .. 3), 'A') {
452 $r .= $_;
453}
454is ($r, '321A', 'Reverse for list via .. with trailing value with explicit $_');
455$r = '';
456for $_ (reverse ('A' .. 'C'), 1) {
457 $r .= $_;
458}
459is ($r, 'CBA1', 'Reverse for list via .. with trailing value with explicit $_');
4ef67d78
NC
460
461$r = '';
4d46db71
NC
462for my $i (1, reverse @array) {
463 $r .= $i;
464}
465is ($r, '1CBA', 'Reverse for array with leading value and var');
466$r = '';
467for my $i ('A', reverse 1,2,3) {
468 $r .= $i;
469}
470is ($r, 'A321', 'Reverse for list with leading value and var');
471$r = '';
472for my $i (1, reverse map {$_} @array) {
473 $r .= $i;
474}
475is ($r, '1CBA', 'Reverse for array via map with leading value and var');
476$r = '';
477for my $i ('A', reverse map {$_} 1,2,3) {
478 $r .= $i;
479}
480is ($r, 'A321', 'Reverse for list via map with leading value and var');
4b70616d
A
481$r = '';
482for my $i ('A', reverse 1 .. 3) {
483 $r .= $i;
484}
485is ($r, 'A321', 'Reverse for list via .. with leading value and var');
486$r = '';
487for my $i (1, reverse 'A' .. 'C') {
488 $r .= $i;
489}
490is ($r, '1CBA', 'Reverse for list via .. with leading value and var');
4d46db71
NC
491
492$r = '';
493for my $i (reverse (@array), 1) {
494 $r .= $i;
495}
496is ($r, 'CBA1', 'Reverse for array with trailing value and var');
497$r = '';
498for my $i (reverse (1,2,3), 'A') {
499 $r .= $i;
500}
501is ($r, '321A', 'Reverse for list with trailing value and var');
502$r = '';
503for my $i (reverse (map {$_} @array), 1) {
504 $r .= $i;
505}
506is ($r, 'CBA1', 'Reverse for array via map with trailing value and var');
507$r = '';
508for my $i (reverse (map {$_} 1,2,3), 'A') {
509 $r .= $i;
510}
511is ($r, '321A', 'Reverse for list via map with trailing value and var');
4b70616d
A
512$r = '';
513for my $i (reverse (1 .. 3), 'A') {
514 $r .= $i;
515}
516is ($r, '321A', 'Reverse for list via .. with trailing value and var');
517$r = '';
518for my $i (reverse ('A' .. 'C'), 1) {
519 $r .= $i;
520}
521is ($r, 'CBA1', 'Reverse for list via .. with trailing value and var');
4d46db71
NC
522
523
524$r = '';
525for (reverse 1, @array) {
526 $r .= $_;
527}
528is ($r, 'CBA1', 'Reverse for value and array');
529$r = '';
530for (reverse map {$_} 1, @array) {
531 $r .= $_;
532}
533is ($r, 'CBA1', 'Reverse for value and array via map');
4b70616d
A
534$r = '';
535for (reverse 1 .. 3, @array) {
536 $r .= $_;
537}
538is ($r, 'CBA321', 'Reverse for .. and array');
539$r = '';
540for (reverse 'X' .. 'Z', @array) {
541 $r .= $_;
542}
543is ($r, 'CBAZYX', 'Reverse for .. and array');
544$r = '';
545for (reverse map {$_} 1 .. 3, @array) {
546 $r .= $_;
547}
548is ($r, 'CBA321', 'Reverse for .. and array via map');
549$r = '';
550for (reverse map {$_} 'X' .. 'Z', @array) {
551 $r .= $_;
552}
553is ($r, 'CBAZYX', 'Reverse for .. and array via map');
4d46db71
NC
554
555$r = '';
556for (reverse (@array, 1)) {
557 $r .= $_;
558}
559is ($r, '1CBA', 'Reverse for array and value');
560$r = '';
561for (reverse (map {$_} @array, 1)) {
562 $r .= $_;
563}
564is ($r, '1CBA', 'Reverse for array and value via map');
565
4ef67d78
NC
566$r = '';
567for $_ (reverse 1, @array) {
568 $r .= $_;
569}
570is ($r, 'CBA1', 'Reverse for value and array with explicit $_');
571$r = '';
572for $_ (reverse map {$_} 1, @array) {
573 $r .= $_;
574}
575is ($r, 'CBA1', 'Reverse for value and array via map with explicit $_');
4b70616d
A
576$r = '';
577for $_ (reverse 1 .. 3, @array) {
578 $r .= $_;
579}
580is ($r, 'CBA321', 'Reverse for .. and array with explicit $_');
581$r = '';
582for $_ (reverse 'X' .. 'Z', @array) {
583 $r .= $_;
584}
585is ($r, 'CBAZYX', 'Reverse for .. and array with explicit $_');
586$r = '';
587for $_ (reverse map {$_} 1 .. 3, @array) {
588 $r .= $_;
589}
590is ($r, 'CBA321', 'Reverse for .. and array via map with explicit $_');
591$r = '';
592for $_ (reverse map {$_} 'X' .. 'Z', @array) {
593 $r .= $_;
594}
595is ($r, 'CBAZYX', 'Reverse for .. and array via map with explicit $_');
4ef67d78
NC
596
597$r = '';
598for $_ (reverse (@array, 1)) {
599 $r .= $_;
600}
601is ($r, '1CBA', 'Reverse for array and value with explicit $_');
602$r = '';
603for $_ (reverse (map {$_} @array, 1)) {
604 $r .= $_;
605}
606is ($r, '1CBA', 'Reverse for array and value via map with explicit $_');
607
4d46db71
NC
608
609$r = '';
610for my $i (reverse 1, @array) {
611 $r .= $i;
612}
613is ($r, 'CBA1', 'Reverse for value and array with var');
614$r = '';
615for my $i (reverse map {$_} 1, @array) {
616 $r .= $i;
617}
618is ($r, 'CBA1', 'Reverse for value and array via map with var');
4b70616d
A
619$r = '';
620for my $i (reverse 1 .. 3, @array) {
621 $r .= $i;
622}
623is ($r, 'CBA321', 'Reverse for .. and array with var');
624$r = '';
625for my $i (reverse 'X' .. 'Z', @array) {
626 $r .= $i;
627}
628is ($r, 'CBAZYX', 'Reverse for .. and array with var');
629$r = '';
630for my $i (reverse map {$_} 1 .. 3, @array) {
631 $r .= $i;
632}
633is ($r, 'CBA321', 'Reverse for .. and array via map with var');
634$r = '';
635for my $i (reverse map {$_} 'X' .. 'Z', @array) {
636 $r .= $i;
637}
638is ($r, 'CBAZYX', 'Reverse for .. and array via map with var');
4d46db71
NC
639
640$r = '';
641for my $i (reverse (@array, 1)) {
642 $r .= $i;
643}
644is ($r, '1CBA', 'Reverse for array and value with var');
645$r = '';
646for my $i (reverse (map {$_} @array, 1)) {
647 $r .= $i;
648}
649is ($r, '1CBA', 'Reverse for array and value via map with var');
18398057
SP
650
651TODO: {
652 $test++;
5a7dac4e
SP
653 local $TODO = "RT #1085: what should be output of perl -we 'print do { foreach (1, 2) { 1; } }'";
654 if (do {17; foreach (1, 2) { 1; } } != 17) {
655 print "not ";
656 }
657 print "ok $test # TODO $TODO\n";
658}
659
660TODO: {
661 $test++;
18398057
SP
662 no warnings 'reserved';
663 local $TODO = "RT #2166: foreach spuriously autovivifies";
664 my %h;
665 foreach (@h{a, b}) {}
666 if(keys(%h)) {
667 print "not ";
668 }
669 print "ok $test # TODO $TODO\n";
670}