On 8/23/06, Derek B. Smith <[EMAIL PROTECTED]> wrote:
From the previous emails, I do not understand what
parts of this code is doing and why is this practical?
The part is $union{$e} = 1  and $isect{$e} = 1 .
Also %count is never used.

It seems like Andrej made some mistakes in his code. I think he could
try something like this:

   =item B<set_op>

       ($union, $isect) = set_op([EMAIL PROTECTED], [EMAIL PROTECTED]);

    Computes the union and intersection of two arrays
    of strings C<@a> and C<@b>, returning array refs

    =cut

   sub unisect {
       my $a = shift;
       my $b = shift;
       my %c;
       my %h;
       %h = (); foreach (@$a) { $c{$_}++ unless $h{$_}++ };
       %h = (); foreach (@$b) { $c{$_}++ unless $h{$_}++ };
#        $c{$_}++ foreach @$a;
#        $c{$_}++ foreach @$b;
       my (@union, @isect);
       while (my ($k, $v) = each %c) {
           push @union, $k;
           push @isect, $k if $v>1;
       }
       return ([EMAIL PROTECTED], [EMAIL PROTECTED]);
   }

The reason I needed
       %h = (); foreach (@$a) { $c{$_}++ unless $h{$_}++ };

is to prevent the case where the arrays may have duplicates. If they
are known to have distinct elements,  this may be replaced by

       $c{$_}++ foreach @$a;

And then I suggest Math::Combinatorics to generate each pair of arrays
in a loop like

   use Math::Combinatorics;
   my $c = Math::Combinatorics->new(count => 2, data => [EMAIL PROTECTED]);

   while (@pair = $c->next_combination) {
       my ($a, $b) = @pair;
       my ($u, $i) = unisect(@pair);
       print "(@$a) U (@$b) = (@$u)\n(@$a) A (@$b) = (@$i)\n\n";
   }

Kind regards,
Adriano Ferreira.

--
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