Bee,

Thanks much for your explanation of where I was going wrong in the foreach
loops.

 cancel.txt contains 2 fields
028076|C

What I ended up doing was:
First looping through %course_info
Then looping through the array of canceled courses
If there was a match, I changed the value in the hash and then exited the
loop

I then looped through the db and printed it out with it's new values.

I'll incorporate your suggestions and thanks again,
Pam



        #loop through all the courses in db
        #if edp matches a canceled edp, change status to C (cancel)
        foreach $item (keys %course_info){
                foreach $cancel_edp( @{$aref} ){
                        if($item == $cancel_edp){
                                #change the status to canceled
                                $course_info{$item}[8] = "C";
                                
                                print("\n\nCANCEL $item
-----------------\n");
                                for $i (0 .. $#{ $course_info{$item} } ){
                                        print("$i:
$course_info{$item}[$i]\n");
                                }       
                        }
                } #end foreach of the canceled courses
        } #end foreach of the courses in the db



        #print out the db to a file
        foreach $item (keys %course_info){
                print("$item\n");
                for $i (0 .. $#{ $course_info{$item} } ){
                        print("$i: $course_info{$item}[$i]\n");
                }       
                print("--------------------\n");
        } #end foreach of the courses in the db




-----Original Message-----
From: Bee [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, October 05, 2004 5:35 PM
To: [EMAIL PROTECTED]; [EMAIL PROTECTED]
Subject: Re: newbie stuck in a HOA



----- Original Message ----- 
From: <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Wednesday, October 06, 2004 4:32 AM
Subject: newbie stuck in a HOA


> Hi all,
>
> I have a flatfile database (falldata.tmp) that contains information 
> about all the courses offered this includes: course number, course 
> title, start date, day of week, location, html link, section number, 
> fee1, fee2, and status.
>
> I have another file (cancel.txt) which contains a list of the courses 
> that are canceled.

Not sure what's inside cancel.txt, course code or what ?

>
> What I want to do is change the status to "C" in the flatfile 
> database, if it is in the cancel file.
>
> The problem I'm having is that
> I'm getting duplicate results and also incorrect results as the code 
> isn't distinguishing between a canceled class and one that's not.
>
>
> Any ideas on where I'm going wrong.
> Thanks in advance,
> Pam
>
>
> sample data:
> 028076|Beginning Acting I|Sept 18|Sat|San 
> 028076|Francisco|028086.html|1|275|0||
>
>
> results:
> OKAY 028860 ------------------
> 0: Impressionism: The Poetry of the Passing Moment
> 1: Oct 6
> 2: Wed
> 3: San Francisco
> 4: 028860.html
> 5:
> 6: 395
> 7: 0
> 8:
>
>
> OKAY 028860 ------------------
> 0: Impressionism: The Poetry of the Passing Moment
> 1: Oct 6
> 2: Wed
> 3: San Francisco
> 4: 028860.html
> 5:
> 6: 395
> 7: 0
> 8:
>
> CANCEL 028837 -----------------
> 0: Art, Architecture, and Culture of Cuba
> 1: Sept 13
> 2: Mon
> 3: Berkeley
> 4: 028837.html
> 5:
> 6: 365
> 7: 0
> 8: C
>
>
> OKAY 028837 ------------------
> 0: Art, Architecture, and Culture of Cuba
> 1: Sept 13
> 2: Mon
> 3: Berkeley
> 4: 028837.html
> 5:
> 6: 365
> 7: 0
> 8: C
>
>
>
>
> here's the code:
> #!/usr/bin/perl -w
> #Purpose update catalog database with C for cancel
> use strict;
>
> #make a backup
> #system `cp /dept/unxmkt/www/cgi-bin/catalog/fall.txt ./falldata.bak`; 
> #system `cp /dept/unxmkt/www/cgi-bin/catalog/fall.txt ./falldata.tmp`;
>
> #declare global variables
> my $aref= "";

You won't need this . So please delete this.

>
> get_cancel();
> add_cancel($aref);

Simply instead with :
add_cancel ( get_cancel ) ;

>
> #open file of canceled courses, push it on array @edp_cancel sub 
> get_cancel{ my (@edp_cancel, $edp_cancel, $item, $status);

If not declare these vars for picking up arguments, don't declare vars too
early. It just no different for you to turn off strict and warnings.

my @edp_cancel ; # is enough

> open(CANCEL, "cancel.txt") or die("no cancelfile: ");
>
> while( defined($_= <CANCEL>) ){ chomp($_);

Make it clear :
while (<CANCEL>) { chomp ;

> ($edp_cancel, $status) = split(/\|/, $_);

my ($edp_cancel, $status) = split /\|/, $_;

> push @edp_cancel, $edp_cancel;
> }
>
> #use array reference in order to return a value
> $aref = [EMAIL PROTECTED];
> return $aref;

return @edp_cancel ; # is enough
I don't see anywhere you need this to be an array reference.


> close CANCEL;

You should put this line before you 'returns'.

> } #end get_cancel
>
>
> sub add_cancel{
> #opens up copy of database, and splits data
> #if match on edp adds "C" to database in status field

my @cancel_list = @_;

We will use it later

>
> my (%course_info, $course_info, $item, @edp, $edp, $course, $start, 
> $day, $loc, $link, $sec, $fee1, $fee2, $status, $cancel_edp, $i);

@edp, and then $edp, even that's ok, but it still likely to make
confusion... and some evils... I guess :-)

my %course_info ; # is enough

>
> #DEBUG
> #for my $cancel_edp(@{$aref}){
> #print("$cancel_edp ");
> #}
>
> open(TEMP, "falldata.tmp") or die("no temp file: ");
>
> while( defined($_ = <TEMP>) ){

while (<TEMP>) { chomp ;

> #split up the fields
> ($edp, $course, $start, $day, $loc, $link, $sec, $fee1, $fee2, 
> $status) =
split(/\|/, $_);

You won't need the above line, instead :

my @stuffs = split /\|/, $_;
my $edp = shift @stuffs;

>
> #put course info into hash of array with edp the key 
> $course_info{$edp} = [$course, $start, $day, $loc, $link, $sec, $fee1, 
> $fee2, $status];

$course_info{$edp}= [EMAIL PROTECTED] ;

>
> } #end while
>
> #DEBUG
> #foreach $item ( keys %course_info) {
> #print("$item: @{ $course_info{$item} }\n");
> #}
>
>
> #loop through all the courses in db
> #if edp matches a canceled edp, change status to C (cancel) foreach 
> $item (keys %course_info){

foreach my $item ( keys %course_info ) {

> foreach $cancel_edp( @{$aref} ){

foreach my $cancel_item ( @cancel_list ) {
# I declare @cancel_list at this sub begins.

> if($item == $cancel_edp){

if ( $item == $cancel_item ) {

> #change the status to canceled
> $course_info{$item}[8] = "C";
>
> print("\n\nCANCEL $item --------------\n");

You print once here for a cancel item.
( in the foreach loop of @cancel_list )

> for $i (0 .. $#{ $course_info{$item} } ){

for my $i ( 0.. $#{$course_info{$item}} ){

> print("$i: $course_info{$item}[$i]\n");
> }
>
> }
>
>
> else{
> print("\n\nOKAY $item ----------------\n");
> for $i (0 .. $#{ $course_info{$item} } ){

for my $i ( 0.. $#{$course_info{$item}} ){

> print("$i: $course_info{$item}[$i]\n");

You print once here for a OK item
( still in the foreach loop of @cancel_list )


> }
>
> }
> } #end foreach of the canceled courses

The point you print twice is because this for loop is under @cancel_list,
each elems rolls a chance to print once. If there are 3 elems in the
@cancel_list, you will print 3 times. The more elems in @cancel_list, more
times you will print.

So why the last round is OKAY while you can see that's "C" ? That's because
the $item is no more targeting on 028837, so, that's the "ELSE" case, so,
prints OKAY.

> } #end foreach of the courses in the db
>
> close TEMP;
> } #end add_cancel
>

HTH,
Bee





-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to