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

If you are using strictures (use strict; use warnings;) and ensure you aren't using global variables (make sure @plist is inside a sub for a start) then you'll probably find the problem pretty quickly.

If that doesn't sort the issue out for you, you should pare down your code to a self contained runnable sample that shows the issue and post that. You may find I know what I mean. Why don't you? helps.

True laziness is hard work
  • Comment on Re: Why are elements of my array getting deleted?

Replies are listed 'Best First'.
Re^2: Why are elements of my array getting deleted?
by iKnowNothing (Scribe) on Apr 19, 2012 at 00:22 UTC
    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: ============ ============

      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