in reply to adding number to array name

There are a slew of problems in this sample. For a start I strongly recommend that you add use strict; use warnings; to all the Perl scripts you write or maintain!

Your immediate problem is solved by using an array of arrays. The syntax changes from @store_get_dist1 to @{$store_get_dist[1]}.

Now for the real issues:

The following may be a little closer to what you require (untested):

use strict; use warnings; my @all_stores; my @store_get_dist; my $dbv; my $count = 0; my $test_num = 1; # Finds district for all stores foreach my $dist_fld (@all_stores) { $test_num++ if ++$count =~ /(\d*)998/; my $new = $dist_fld.","; print "$new\n"; push(@{$store_get_dist[$test_num]},$new); } print "Number of queries needed: $test_num\n"; for my $i (1 .. $test_num) { my $last_one = pop @{$store_get_dist[$i]}; #error occurs here chop($last_one); push (@{$store_get_dist[$i]}, $last_one); #error occurs here # GRAB ALL STORE, DISTRICT, REGION AND GROUP info my $get_district = "SELECT distinct(DIST_I)\n". "FROM BCE_STORE\n". "WHERE LOC_I in (@store_get_dist${i})"; my $grab_dist = $dbv->prepare("$get_district"); ### Execute the statement in the database $grab_dist->execute; print "$get_district\n"; while ( my $row = $grab_dist->fetchrow( ) ) { print "$row\n"; } }

Update opps, @{$store_get_dist[1]} -> @{$store_get_dist[$test_num]}


DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^2: adding number to array name
by Mandrake (Chaplain) on Aug 24, 2006 at 06:58 UTC
    Sorry if I misunderstood the orginal post.
    From the orginal post, if count is less than 998 value will be added to @store_get_dist1, @store_get_dist2 and @store_get_dist3.
    If the count is less than 1998 and greater than or equal to 998, the value will be addded to both @store_get_dist2 and @store_get_dist3.
    At the time when the count is 1998, there should be 997 elements in @store_get_dist1 and 1997 elements in @store_get_dist2.
    In your array of array implementation, When I add
    print scalar(@{$store_get_dist[1]});
    it prints 997 and prints 1000 for index 2. Not sure if this is the expected behaviour.
    It should have been 997 and 1997 respectively. Am I missing anything?

    Update:
    From
    push(@{$store_get_dist[$test_num]},$new);
    to
    for ($test_num.. int((($#all_stores+3)/1000)+1)) { #3 to account for 998 1998 and 2998 push(@{$store_get_dist[$_]},$new); }
    and it should work. A quick dirty hack though.

      The behaviour implied by the original code is sufficiently odd that I assumed that it was in error rather than by design, especially in light of some of the other things that clearly were errors such as the additions in void context.

      It seemed much more likely that the data was intended to be partitioned into different groups than that groups with replicated information were required.


      DWIM is Perl's answer to Gödel