in reply to Re^4: Shift returning pointer
in thread Shift returning pointer

You're confusing me. Once again, you're showing me half of your code (the assignment part this time), and not the part where you are getting the values out. This is new code, and I'm a little frustrated that you say you've found the problem, and it's in code you never showed us. Are you trying to say that $environment is an array ref, but otherwise your code works fine? That's what my previous reply was attempting to fix. I didn't mean for you to take away all brackets everywhere, especially considering I've never seen this line of code before. Would you care to post a more complete code sample?

Replies are listed 'Best First'.
Re^6: Shift returning pointer
by rgb96 (Acolyte) on Mar 16, 2009 at 19:17 UTC

    Sorry, the whole program is 1000+ lines. I'll try to be more clear. I have two tree views, and I want a person to be able to select an element from one, press a button, and have that element to be added the second treeview on the right. Below are the declarations for both lists, The first is $Envs, the second is $EnvsToRun. Also, where I fill the first list, get the element that I want to put into the second list, and where I add the element to the second list. $duration and $config are variables that I am not having problems with.

    $Envs = Gtk2::Ex::Simple::List->new_from_treeview ( $abaNewWindow->get +_widget('Envs'), 'Environments' => 'text'); $EnvsToRun = Gtk2::Ex::Simple::List->new_from_treeview ( $abaNewWindow +->get_widget('EnvsToRun'), 'Environments' => 'text', 'Duration' => 'd +ouble', 'Config' => 'int'); open(ENVIRONMENTS, "environments.txt"); while(<ENVIRONMENTS>){ my $line = $_; chomp($line); push @{$Envs->{data}}, $line; } close(ENVIRONMENTS); $environment = shift @{$Envs->{data}}; print $environment; push @{$EnvsToRun->{data}}, [$environment, $duration, $config];
      You still left out the portion where you are reading from @{$EnvsToRun->{data}}. The thing to keep in mind here is that $EnvsToRun->{data} is a reference to an array. This array holds one entry per environment. That entry itself is a reference to another, inner array, which has 3 elements. I suspect you are reading it something like this:
      my ($environment, $duration, $config) = @{$EnvsToRun->{data}};
      That's not right, you'll get an array ref in $environment. You forgot that @{$EnvsToRun->{data}} holds many inner lists, each of them with 3 elements in it. To get the first one out by itself, you'd do something like this (note the ->[0]):
      my ($environment, $duration, $config) = @{$EnvsToRun->{data}->[0]};
      In practice, to deal with all of the combinations, you need to iterate over the outer array and then for each item there process the inner array. Like this:
      for my $CurrentEnv (@{$EnvsToRun->{data}}) { my ($environment, $duration, $config) = @$CurrentEnv; ... }
      If you don't want many inner lists, but just the one, you shouldn't be using push at all when assigning to $EnvsToRun->{data}. Instead, a simple assignment:
      $EnvsToRun->{data} = [$environment, $duration, $config]; ... later ... ($environment, $duration, $config) = @{$EnvsToRun->{data}};

        I don't have to read from $EnvsToRun. Whatever you put in it just shows up in the treeview.