This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add Rafael's 5.10 roadmap to perltodo.
[perl5.git] / t / cmd / for.t
CommitLineData
8d063cd8
LW
1#!./perl
2
4ef67d78 3print "1..78\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');
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
4ef67d78
NC
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 $_');
4d46db71
NC
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 = '';
4ef67d78
NC
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 = '';
4d46db71
NC
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
4ef67d78
NC
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
4d46db71
NC
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');