in reply to Re: Re: Help needed to make a conditional statement
in thread Help needed to make a conditional statement

A couple of problems here. First, $count will need to be specified in a more maintainable manner, such as using scalar on your arrays and finding the greater value. Second, you're looking at the value of $count in your evaluations, not the value of the index in your arrays that $count points to. Finally, by adding @db to your conditionals i.e.,if (exists $in_lookup{$count}, @db) you are ensuring that the test will return 'true' always unless the array is empty. So, the way you've got it now it executes the first conditional branch 7 times and then exits.

I'm still struggling to see what exactly you're attempting -- if element A in array @in exists in array @db, remove A from @db. Else, if element A does not exist in array @db, append it to @db. Is this right?

Replies are listed 'Best First'.
Re: Re: Re: Re: Help needed to make a conditional statement
by jonnyfolk (Vicar) on Dec 04, 2002 at 20:11 UTC
    Sorry - I see I wasn't very clear, although you're absolutely right in your interpretation. After operating on the first input @in the @db should contain
    my @db = (1, 3, 5, 7, 9, 11); my @in = (1, 2, 5, 8, 9, 10, 13); # results in: my @db = (3, 7, 11);
    operating on the second example should give:
    my @db = (1, 3, 5, 7, 9, 11); my @in = (21, 22, 25, 28, 29, 210, 213); # results in: my @db = (1, 3, 5, 7, 9, 11, 21, 22, 25, 28, 29, 210, 21 +3);

      Good, then we don't even require conditionals. Simply make two passes over the arrays: the first to remove elements that exist in @in; the second to append elements in @in to @db:

      #my @db = (1, 3, 5, 7, 9, 11); #my @in = (1, 2, 5, 8, 9, 10, 13); my @db = (1, 3, 5, 7, 9, 11); my @in = (21, 22, 25, 28, 29, 210, 213); my (%db_lookup, %in_lookup); @db_lookup{@db} = (); @in_lookup{@in} = (); my @out = grep { not exists $in_lookup{$_} } @db; push @out, grep { not exists $db_lookup{$_} } @in; print "view: @out \n";

      Output from the first set is: 3 7 11 2 8 10 13. This differs from your sample output, but I think this actually does what you want. The second sample gives: 1 3 5 7 9 11 21 22 25 28 29 210 213, which matches exactly.