Funktionen für Arrayberechnungen (Schnittmenge, Durchschnitt, Differenz).
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 26 Aug 2009 13:57:43 +0000 (15:57 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Fri, 28 Aug 2009 15:31:22 +0000 (17:31 +0200)
SL/MoreCommon.pm

index 1ee62cc..e09d7c8 100644 (file)
@@ -3,7 +3,8 @@ package SL::MoreCommon;
 require Exporter;
 @ISA = qw(Exporter);
 
-@EXPORT = qw(save_form restore_form compare_numbers any cross);
+@EXPORT    = qw(save_form restore_form compare_numbers any cross);
+@EXPORT_OK = qw(ary_union ary_intersect ary_diff);
 
 use YAML;
 
@@ -127,4 +128,35 @@ sub cross(&\@\@) {
   }  0 .. $#A;
 }
 
+sub _ary_calc_union_intersect {
+  my ($a, $b) = @_;
+
+  my %count = ();
+
+  foreach my $e (@$a, @$b) { $count{$e}++ }
+
+  my @union = ();
+  my @isect = ();
+  foreach my $e (keys %count) {
+    push @union, $e;
+    push @isect, $e if $count{$e} == 2;
+  }
+
+  return (\@union, \@isect);
+}
+
+sub ary_union {
+  return @{ (_ary_calc_union_intersect @_)[0] };
+}
+
+sub ary_intersect {
+  return @{ (_ary_calc_union_intersect @_)[1] };
+}
+
+sub ary_diff {
+  my ($a, $b) = @_;
+  my %in_b    = map { $_ => 1 } @$b;
+  return grep { !$in_b{$_} } @$a;
+}
+
 1;