Kreuzprodukt aus zwei Arrays in List::MoreUtils Stil.
authorSven Schöling <s.schoeling@linet-services.de>
Tue, 10 Mar 2009 17:09:21 +0000 (17:09 +0000)
committerSven Schöling <s.schoeling@linet-services.de>
Tue, 10 Mar 2009 17:09:21 +0000 (17:09 +0000)
usage:

@crossed_array = cross { func($a, $b) } @array1, @array2;

bin/mozilla/common.pl

index 1c308da..16e1b46 100644 (file)
@@ -580,4 +580,31 @@ sub cov_selection_internal {
   $lxdebug->leave_sub();
 }
 
+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'};
+  };
+
+  my $limit = $#A > $#B? $#A : $#B;    # loop iteration limit
+
+  local(*$caller_a, *$caller_b);
+
+ # This map expression is also the return value.
+  map { my $b_index = $_;
+    map { my $a_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 .. $#A;
+  }  0 .. $#B;
+}
+
 1;