> 3) Write a Perl function that takes two references to arrays and returns the > intersect of them. > If an entry appears n times in array 1 and m times in array 2, > the output should list that entry min(n,m) times. > Bonus mark for one line solutions.
#!/usr/bin/perl -w #*** compare_int_arrays_v001.pl ***# #------------------------------------------------- use strict; #------------------------------------------------- my (@i_list1, @i_list2); push(@i_list1, int(rand(100))) for(1..200); push(@i_list2, int(rand(20))) for(1..10); print("value:\tlist 1:\tlist 2:\n"); print("$_->[0]\t$_->[1]\t$_->[2]\n") for(@{Intersect(\...@i_list1, \...@i_list2)}); #------------------------------------------------- sub Intersect { my ($rai_1, $rai_2) = @_; return [] unless(ref($rai_1) eq 'ARRAY' && ref($rai_2) eq 'ARRAY'); my (%i_seen, @i_ret); $i_seen{$_}[0]++ for(@$rai_1); $i_seen{$_}[1]++ for(@$rai_2); @i_ret = map [$_, $i_seen{$_}[0], $i_seen{$_}[1]], grep $i_seen{$_}[0] && $i_seen{$_}[1], keys(%i_seen); return [sort({ $a->[0] <=> $b->[0]} @i_ret)]; } #------------------------------------------------- Torsten