http://www.perlmonks.org?node_id=965825


in reply to Re^2: Why are elements of my array getting deleted?
in thread Why are elements of my array getting deleted?

Well, they do say you have to work hard to be lazy. Very often using the default variable is too lazy, as in this case. Consider:

use strict; run(); sub run { my @plist = ("ABC", "DEF"); dumpList("Initial list", @plist); foreach (@plist) { my $ccmexecResult = ccmexec_nodie("echo HelloWorld"); dumpList("ccmexec returned: $ccmexecResult", @plist); } } sub dumpList { my ($when, @list) = @_; print "$when\n", join "\n", @list, '', ''; } sub ccmexec_nodie { my $command = $_[0]; $_ = "Well that sucks"; return "$command: result"; }

Prints:

Initial list ABC DEF ccmexec returned: echo HelloWorld: result Well that sucks DEF ccmexec returned: echo HelloWorld: result Well that sucks Well that sucks

The loop variable used by for is aliased to each element in the array. If you are lazy and use the default variable for the loop variable then change the contents of the default variable you end up changing the contents of the array element being processed. The simple fix is to use an explicit loop variable:

foreach my $element (@plist) {
True laziness is hard work