From 46e1506b7ccd09f451b1c33f9b42f450b96f55fd Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Wed, 26 Aug 2009 15:57:43 +0200 Subject: [PATCH] =?utf8?q?Funktionen=20f=C3=BCr=20Arrayberechnungen=20(Sch?= =?utf8?q?nittmenge,=20Durchschnitt,=20Differenz).?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- SL/MoreCommon.pm | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) 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; -- 2.20.1