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

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];

Replies are listed 'Best First'.
Re^7: Shift returning pointer
by bellaire (Hermit) on Mar 16, 2009 at 19:35 UTC
    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.

        Surely there is code that passes $EnvsToRun to a gtk method which creates the treeview. Which method is that, and what syntax are you using there?