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

I was able to recreate the behavior in this script below. Note that an element of plist is getting cleared in each iteration.
use strict; use IPC::Open3; my @plist = ("ABC","DEF","GHI"); print "plist Before ccmexec:\n============\n",join("\n",@plist),"\n=== +=========\n\n"; my $ccmexecResult; foreach( @plist){ $ccmexecResult = ccmexec_nodie("echo HelloWorld"); print "ccmexec returned: $ccmexecResult\n"; print "plist After ccmexec:\n============\n",join("\n",@plist),"\n +============\n\n"; } sub ccmexec_nodie { my $command = $_[0]; my ($mystdin,$mystdout,$mystderr); my $pid = open3($mystdin,$mystdout,$mystderr,$command); my $myresult = ""; while(<$mystdout>){ $myresult = "$myresult$_"; } return $myresult; }
This produced the output:
plist Before ccmexec: ============ ABC DEF GHI ============ ccmexec returned: HelloWorld plist After ccmexec: ============ DEF GHI ============ ccmexec returned: HelloWorld plist After ccmexec: ============ GHI ============ ccmexec returned: HelloWorld plist After ccmexec: ============ ============

Replies are listed 'Best First'.
Re^3: Why are elements of my array getting deleted?
by GrandFather (Saint) on Apr 19, 2012 at 00:50 UTC

    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