Hmm interesting!
I was sure that using De Morgan's laws would just relocate the problem and not solve it. (you're now only deleting hash-slices)
But this relocation makes sense ... now it works for all cases where "undef" isn't allowed as part of an initial set. (undef deletes empty strings).
But you shouldn't use print to inspect data structures:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dump qw(pp);
my @array1=(1..2,"");
my @array2=(2..3,undef);
my (%union, %sdiff, %sd1, %sd2, %inter);
@union{(@array1,@array2)} = (@array1,@array2);
%sd1 = %sd2 = %inter = %union;
delete @sd1{@array2};
delete @sd2{@array1};
%sdiff = (%sd1,%sd2);
delete @inter{keys %sdiff};
print "array1: ", pp(\@array1), "\n";
print "array2: ", pp(\@array2), "\n";
print "union: ", pp(\%union), "\n";
print "sdiff: ", pp(\%sdiff), "\n";
print "inter: ", pp(\%inter), "\n";
print "sd1: ", pp(\%sd1), "\n";
print "sd2: ", pp(\%sd2), "\n";
prints
Use of uninitialized value $array2[2] in hash slice at /home/lanx/B/PL
+/PM/set2.pl line 12.
Use of uninitialized value $array2[2] in delete at /home/lanx/B/PL/PM/
+set2.pl line 16.
array1: [1, 2, ""]
array2: [2, 3, undef]
union: { "" => undef, 1 => 1, 2 => 2, 3 => 3 }
sdiff: { 1 => 1, 3 => 3 }
inter: { "" => undef, 2 => 2 }
sd1: { 1 => 1 }
sd2: { 3 => 3 }
But while you found a mathematical solution, needing so many operations for an intersection is in practice a little disappointing ...
Thanks anyway! :)
|