The breakout of where a subroutine ends and begins is largely a matter of personal preference. You'll have to iterate over all the groups somewhere, I would tend to do it where my rough example showed so that subroutine group_is_OK wouldn't need to know whether the group being examined is part of a hash, array, or something else. One could easily write another subroutine to do the hash traversal. YMMV.
For Don: %groups is a hash of arrays, so the values of the hash are array references. The elements of the array are themselves hashes, seeing as my example used fetchrow_hashref. group_is_OK should begin like this, to continue my example. sub group_is_OK { my $aryref = shift; # ref($aryref) will be eq 'ARRAY' foreach my $group_member (@$aryref) { # ref($group_member) eq 'HASH' } # some value here that reflects whether the group is OK } I apologize for having presented an incorrect amount of information (whether too little or too much, I don't know, heh). I was mainly trying to illustrate why I think there are better alternatives to finding some way to loop through a recordset twice. At 11:24 AM 11/2/01 -0500, Etienne Marcotte wrote: > > my %groups; > > while (my $hashref = $sth->fetchrow_hashref) { > > push @{$groups{$hashref->{group_num}}}, $hashref; > > } > > > > then later... > > > > foreach my $group_number (keys %groups) { > > delete $groups{$group_number} unless > group_is_OK($groups{$group_number}); > > } > >I don't understand why you're calling group_is_OK each time.. >you can send all your %group to a sub that checks the group and deletes it >if not >good? You would have to do one fuction call instead of calling it for each >group! > >Or if group_is_Ok is a function used elsewhere where you don't want to >delete the >not_OK groups, you could have group_is_OK return an array of the keys >where groups >are not ok (or of the keys where gourps are OK).. and then the deleting >part would >just delete each record with the key in the array returned by the group_is_ok >function. (humm I'm not very clear, hope you understand!) > >my 0.02$ > >Etienne > > >Don Seiler wrote: > > > When I pass in a hash to a function like below: > > > > group_is_OK($groups{$group_number}); > > > > I'm confused as to how to handle that argument with in the function, > > knowing the there are multiple values for that key. > > > > I start out with this: > > > > sub group_is_OK > > { > > my $hash = $_; > > > > # <insert a lot of confused and hopeless code here> > > > > } > > > > I want to loop through the collection of records passed in and perform my > > calculations. I've tried for and foreach loops, but probably don't know > > what kind of data structure I'm dealing with. > > > > the %groups hash is defined as below. > > > > Any hints? > > > > On Thu, 1 Nov 2001, David Marshall wrote: > > > > > I'll second the suggestion made a few messages back about storing your > > > results in some other data structure (as opposed to re-traversing the > data > > > structure that DBI gives you). > > > > > > In your circumstances, I'd probably put the retrieved rows in a hash of > > > arrays (keyed by group number) before doing anything else. Then I'd > > > examine each array of records in the group and delete it from the hash if > > > it didn't qualify. Then the HoA that is left over can be traversed for > > > whatever the final output is. > > > > > > The code might look something like this: > > > > > > my %groups; > > > while (my $hashref = $sth->fetchrow_hashref) { > > > push @{$groups{$hashref->{group_num}}}, $hashref; > > > } > > > > > > then later... > > > > > > foreach my $group_number (keys %groups) { > > > delete $groups{$group_number} unless > group_is_OK($groups{$group_number}); > > > } > > > > > > then finally... > > > > > > spew_group($_) foreach values %groups; > > > > > > YMMV on exact implementation. In similar implementations, I will often > > > have other stuff in the data structure beyond that which I got > directly out > > > of the database. It all depends. > > > > > > At 01:26 PM 11/1/01 -0600, Don Seiler wrote: > > > >Perhaps I'm missing it, then. > > > > > > > >basically my query is this: > > > > > > > >select cust_no, acct_type, acct_status, group_num > > > >from cust,acct > > > >where cust.cust_no=acct.cust_no > > > >order by group_num > > > > > > > >the values of acct_type and acct_status for all of the records in > > > >a group determine if I want that group or not. I don't think I can make > > > >that determination until I've gone through the recordset though. > > > > > > > >-- > > > >Don Seiler [EMAIL PROTECTED] > > > >Database Administrator / Sr Software Engineer > > > >NSightTel Billing LLC Phone: 920.617.7501 > > > >1580 Mid Valley Drive Fax: 920.617.7493 > > > >De Pere, WI 54115 Cell: 920.606.3240 > > > >Pager: [EMAIL PROTECTED] / 920.613.2000 > > > > > > > > > > > >On Thu, 1 Nov 2001, Marcelo Guelfi wrote: > > > > > > > > > > > > > > Are you sure that you can't use the GROUP BY clause? > > > > > > > > > > Saludos, > > > > > Marcelo. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > "Don Seiler" > > > > > <Don.Seiler@Ce To: Michael Peppler > > > > <[EMAIL PROTECTED]> > > > > > llcom.com> cc: Marcelo > > > > Guelfi/Uruguay/Contr/IBM@IBMUY, <[EMAIL PROTECTED]> > > > > > Subject: Re: Looping > > > > through recordset twice > > > > > 01/11/2001 > > > > > 16:13 > > > > > Please respond > > > > > to "Don > > > > > Seiler" > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Basically, when I get to a new group number. The record set is > ordered by > > > > > group number, so all records in a group are together. As I'm looping > > > > > through records in a group, I do some evaluation and add values to > > > > > variables. When I get to a new group number, I look at the > values. If > > > > > they meet my criteria I add the last group number to an array. > > > > > > > > > > Then when I'm done I planned to loop again through the record set > and if > > > > > the group number matches one in the array I'd print it. > > > > > > > > > > This is probably horribly inefficient and I'm leaning towards > saving the > > > > > records to a tmp array and if they qualify saving that to master > array for > > > > > later printing. > > > > > > > > > > Don. > > > > > > > > > > On Thu, 1 Nov 2001, Michael Peppler wrote: > > > > > > > > > > > Don Seiler writes: > > > > > > > Actually the nature of the problem is what stopped me from > doing this. > > > > > > > > > > > > > > I won't know which records I want until I look at the group > of them. > > > > > > > > > > > > > > Example: I have a table of records. There is a "groupnum" > column. > > > > > Many > > > > > > > records have the same "groupnum", i.e. they are in the same > group. > > > > > I'm > > > > > > > only interested in selecting the group as a whole. I will > only know > > > > > if I > > > > > > > want this group based on examining all of the records for > that group. > > > > > > > > > > > > Hmmm - what condition determins that a group is complete? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >