From f30b6f52b1684388cebc0878b73c39c6b1040749 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sven=20Sch=C3=B6ling?= Date: Tue, 17 Mar 2009 14:59:00 +0000 Subject: [PATCH] cross von common.pl nach MoreCommon verschoben. --- SL/MoreCommon.pm | 44 ++++++++++++++++++++++++++++++++++++++++++- bin/mozilla/common.pl | 42 ----------------------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/SL/MoreCommon.pm b/SL/MoreCommon.pm index e4e13e85d..699a6724a 100644 --- a/SL/MoreCommon.pm +++ b/SL/MoreCommon.pm @@ -3,7 +3,7 @@ package SL::MoreCommon; require Exporter; @ISA = qw(Exporter); -@EXPORT = qw(save_form restore_form compare_numbers any); +@EXPORT = qw(save_form restore_form compare_numbers any cross); use YAML; @@ -85,4 +85,46 @@ sub any (&@) { return 0; } +=item cross BLOCK ARRAY ARRAY + +Evaluates BLOCK for each combination of elements in ARRAY1 and ARRAY2 +and returns a new list consisting of BLOCK's return values. +The two elements are set to $a and $b. +Note that those two are aliases to the original value so changing them +will modify the input arrays. + + # append each to each + @a = qw/a b c/; + @b = qw/1 2 3/; + @x = pairwise { "$a$b" } @a, @b; + # returns a1, a2, a3, b1, b2, b3, c1, c2, c3 + +As cross expects an array but returns a list it is not directly chainable +at the moment. This will be corrected in the future. + +=cut +sub cross(&\@\@) { + my $op = shift; + use vars qw/@A @B/; + local (*A, *B) = @_; # syms for caller's input arrays + + # Localise $a, $b + my ($caller_a, $caller_b) = do { + my $pkg = caller(); + no strict 'refs'; + \*{$pkg.'::a'}, \*{$pkg.'::b'}; + }; + + local(*$caller_a, *$caller_b); + + # This map expression is also the return value. + map { my $a_index = $_; + map { my $b_index = $_; + # assign to $a, $b as refs to caller's array elements + (*$caller_a, *$caller_b) = \($A[$a_index], $B[$b_index]); + $op->(); # perform the transformation + } 0 .. $#B; + } 0 .. $#A; +} + 1; diff --git a/bin/mozilla/common.pl b/bin/mozilla/common.pl index 26fd6456e..1c308dac7 100644 --- a/bin/mozilla/common.pl +++ b/bin/mozilla/common.pl @@ -580,46 +580,4 @@ sub cov_selection_internal { $lxdebug->leave_sub(); } -=item cross BLOCK ARRAY ARRAY - -Evaluates BLOCK for each combination of elements in ARRAY1 and ARRAY2 -and returns a new list consisting of BLOCK's return values. -The two elements are set to $a and $b. -Note that those two are aliases to the original value so changing them -will modify the input arrays. - - # append each to each - @a = qw/a b c/; - @b = qw/1 2 3/; - @x = pairwise { "$a$b" } @a, @b; - # returns a1, a2, a3, b1, b2, b3, c1, c2, c3 - -As cross expects an array but returns a list it is not directly chainable -at the moment. This will be corrected in the future. - -=cut -sub cross(&\@\@) { - my $op = shift; - use vars qw/@A @B/; - local (*A, *B) = @_; # syms for caller's input arrays - - # Localise $a, $b - my ($caller_a, $caller_b) = do { - my $pkg = caller(); - no strict 'refs'; - \*{$pkg.'::a'}, \*{$pkg.'::b'}; - }; - - local(*$caller_a, *$caller_b); - - # This map expression is also the return value. - map { my $a_index = $_; - map { my $b_index = $_; - # assign to $a, $b as refs to caller's array elements - (*$caller_a, *$caller_b) = \($A[$a_index], $B[$b_index]); - $op->(); # perform the transformation - } 0 .. $#B; - } 0 .. $#A; -} - 1; -- 2.20.1