Main Content

Iterating over a Perl list and changing all items

Archive - Originally posted on "The Horse's Mouth" - 2010-06-15 16:21:00 - Graham Ellis

You can loop through a list (we're supposed to call them "lists" not "arrays" in Perl these days!) using a foreach loop running a counter, or using the second form of foreach that doesn't provide a counter. Thus [source link]:

#!/usr/bin/perl
@demo1 = (20,30,50,60,80,200);
@demo2 = (40,70,90,40,20,10,0);
for ($k=0; $k<@demo1; $k++) {
  $demo1[$k] += 2;
  }
print ("@demo1\n");
foreach $item (@demo2) {
  $item += 3;
  }
print ("@demo2\n");


and that runs as follows:

$ perl prog.pl
22 32 52 62 82 202
43 73 93 43 23 13 3
$


In the first form, you're providing a counter and know the element that you're on, thus you could make a change based on the element number. In the second form, you don't have a counter;1 however, many folks don't realise that any changes you make to the "loop variable" are saved back in the list.

In other words, the second form is a very neat way of altering every element of a list. There is no need to actually know the element number, which will allow you to simplify code in many (but not position number-dependent) places.


Note that this trick only works if you specify just an array name in the foreach statement. If you wrote
  foreach $item(@this,@that)
then changes you make to $item are not reflected back in the @this and @that lists.

Further note: the words "for" and "foreach" are interchangeable, so you could save four more bytes if you really want.

Another possibility is to use the map function, or keep your own counter and use the second form of "for". So [source link]:

!#/usr/bin/perl
@demo1 = (20,30,50,60,80,200);
@demo2 = (40,70,90,40,20,10,0);
@demo1 = map($_+7,@demo1);
print ("@demo1\n");
foreach $item (@demo2) {
  $demo2[$n] += 9;
  $n++;
  }
print ("@demo2\n");


The map function is worthy of further study. Each element of a list is put into a special variable called $_ in turn. You can then perform any operation that you wish on that item.

$ prog2.pl
27 37 57 67 87 207
49 79 99 49 29 19 9
$


Illustration - delegates on a recent Perl course