On 22 Nov 2006 at 15:14, Beginner wrote: > "ancode_1" = "ADV " > "ADV_2006" = "117216 " > "ADV_2005" = "104776 " > "ancode_2" = "BAP " > "BAP_2006" = "0 " > "BAP_2005" = "270 " > "ancode_3" = "BOO " > "BOO_2006" = "746854 " > "BOO_2005" = "673151 " > "ancode_4" = "BUS " > "BUS_2006" = "0 " > "BUS_2005" = "2476 " > "ancode_5" = "COM " > "COM_2006" = "87787 " > "COM_2005" = "97009 " > > The number of years can vary so you might get data from 2006->1990. > > The data looks like it is suited to a hash but GD::lines wants the > data passed to in as arrays references ([EMAIL PROTECTED]). That is one array > with all the "ancode_n" and foreach code, an array of all the yearly > values. I have managed to get my data into this type of structure > > 'ADV ' => [ > '117216', > '104776', > ] > 'BAP ' => [ > '0', > '270', > ], > > But I am stuck trying to get it out into n number of arrays that I > can pass to GD. I don't want to pre-declare n number of arrays as the > number may vary and because I am using strict, I don't know how I can > pass the data out of whatever loop I use to get to the values. > > my $gd = GD::Graph::lines->new(600,400); > my @data = ([EMAIL PROTECTED],[EMAIL PROTECTED], a number of arrays equal to > size of > @ancodes); > > This is the bit of code I use to generate the hash of arrays > > use GD::Graph::hbars; > use GD::Graph::lines; > use GD::Graph::Data; > use CGI qw/:standard/; > use Data::Dumper; > use strict; > use warnings; > > my $q = new CGI; > > my @par_names = $q->param; > my (@cl_type,@values,@years,); > my %yrs; > > my $current_code; > for (my $i = 0; $i < $#par_names; ++$i) { > if ($par_names[$i] =~ /ancode_\d+/) { > $current_code = $q->param($par_names[$i]); > push(@cl_type,$q->param($par_names[$i]) ); > } > if ($par_names[$i] =~ /\w{3}_\d{4}/) { > (my $y) = ($par_names[$i] =~ /\w{3}_(\d{4})/); > if (! exists($yrs{$y}) ) { # only accept yrs not > seen. > $yrs{$y} = 0; > } > my $val = $q->param($par_names[$i]); > (my $value = $val) =~ s/\s+$//; > push @{$values{$current_code}},$value; > } > } > > Can someone offer me some pointers here? I am struggling to do this > and I expect there is a short-hand way to achieve what I want. >
I managed to do it with this: my (@data,@leg); foreach my $code (keys %values) { push @leg,$code; my @temparray; for (my $i = 0;$i <$no_years;++$i) { push @temparray, $values{$code}[$i]; } my @foo = reverse @temparray; push @data,[EMAIL PROTECTED]; } That's the best golf I can do. Seems a bit verbose but it works. Dp. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>