From: Moritz Bunkus Date: Wed, 26 Aug 2009 13:57:43 +0000 (+0200) Subject: Funktionen für Arrayberechnungen (Schnittmenge, Durchschnitt, Differenz). X-Git-Tag: release-2.6.1beta1~318 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=46e1506b7ccd09f451b1c33f9b42f450b96f55fd;p=kivitendo-erp.git Funktionen für Arrayberechnungen (Schnittmenge, Durchschnitt, Differenz). --- diff --git a/SL/MoreCommon.pm b/SL/MoreCommon.pm index 1ee62cca4..e09d7c85d 100644 --- a/SL/MoreCommon.pm +++ b/SL/MoreCommon.pm @@ -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;