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

After much fiddling around I have arrived at the following:
#!/usr/bin/perl -w #use strict; use CGI ':standard'; my @db = (1, 3, 5, 7, 9, 11); my @in = (1, 2, 5, 8, 9, 10, 13); my $var = 7; # I have this variable available to indicate the length o +f the array my (%db_lookup, %in_lookup); @db_lookup{@db} = (); @in_lookup{@in} = (); $count = 0; while ($count < $var) { if (exists $in_lookup{$count}, @db) { @db = grep { not exists $in_lookup{$_} } @db; $count += 1; } elsif (not exists $in_lookup{$count}, @db) { push @db, grep { not exists $db_lookup{$_} } @in; $count += 1; } } print "view: @db";
That does what I need when strings match. However when strings don't match the db is unchanged from the original, wheras I need the contents of @in pushed into @db:
my @db = (1, 3, 5, 7, 9, 11); my @in = (21, 22, 25, 28, 29, 210, 213);
Where am I going wrong?

Replies are listed 'Best First'.
Re: Re: Re: Help needed to make a conditional statement
by djantzen (Priest) on Dec 04, 2002 at 19:28 UTC

    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?

      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.

Re: Re: Re: Help needed to make a conditional statement
by jonnyfolk (Vicar) on Dec 04, 2002 at 21:38 UTC
    This is actually a reply to fever.

    The reference to $count is actually pure guesswork on my part. The problem is that I cannot find a way to say "if the input exists - take it out, if it doesn't - put it in". Obviously inclusion of the $count mechanism is more problematical than I'd anticipated but I can't find another approach which comes close to letting me say, "while values of @in match values of @db or the converse".

    That, I think is the crux of the problem!