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
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.