in reply to Compare Lists (Non Unique Intersection)

I don't think the "way to do it" of your update really does it, if I understand correctly what "it" is ... that way would result in two copies of any element that was twice in @temp2, whether it was once, twice, or three or more times in @temp.

Provided I understand correctly what "it" is, I'd count up and down:

my %count; $count{$_}++ for @temp; my @non_unique_intersection = grep { $count{$_}-->0 } @temp2;

This will preserve the order of elements of @temp2, until the count (initially the frequency in @temp of that element's string equivalence class) has been exhausted.

Update: Might as well make a function, while I'm at it:

# my @non_unique_intersection = nonunique_intersect( \@temp, \@temp2 ) +; sub nonunique_intersect { my ($x, $y) = @_; my %count; $count{$_}++ for @$x; my @return = grep { $count{$_}-->0 } @$y; return wantarray ? @return : \@return; }

Update 2: For your next challenge, the non-unique intersection, leftovers from @temp, and leftovers from @temp2; assuming that the bag of ( @temp, @temp2 ) is supposed to be the same as the bag of ( (@non_unique_intersection) x 2, @leftovers, @leftovers2 ):

my %count; $count{$_}++ for @temp; my @non_unique_intersection = grep { $count{$_}-->0 } @temp2; my (@leftovers, @leftovers2); push @{$count{$_}>0 ? \@leftovers : \@leftovers2}, ($_) x abs($count{$ +_}) for keys %count;

print "Just another Perl ${\(trickster and hacker)},"
The Sidhekin proves Sidhe did it!

Replies are listed 'Best First'.
Re^2: Compare Lists (Non Unique Intersection)
by rsiedl (Friar) on Jul 28, 2006 at 06:45 UTC
    how right you are! thanks for pointing that out. ++