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! :)
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.