Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 0975a120

Von Sven Schöling vor mehr als 15 Jahren hinzugefügt

  • ID 0975a120536e57a0f563e04b33f33f14ce8ba89e
  • Vorgänger 084d1390
  • Nachfolger e43cccf4

Kreuzprodukt aus zwei Arrays in List::MoreUtils Stil.

usage:

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

Unterschiede anzeigen:

bin/mozilla/common.pl
580 580
  $lxdebug->leave_sub();
581 581
}
582 582

  
583
sub cross(&\@\@) {
584
  my $op = shift;
585
  use vars qw/@A @B/;
586
  local (*A, *B) = @_;    # syms for caller's input arrays
587

  
588
  # Localise $a, $b
589
  my ($caller_a, $caller_b) = do
590
  {
591
    my $pkg = caller();
592
    no strict 'refs';
593
    \*{$pkg.'::a'}, \*{$pkg.'::b'};
594
  };
595

  
596
  my $limit = $#A > $#B? $#A : $#B;    # loop iteration limit
597

  
598
  local(*$caller_a, *$caller_b);
599

  
600
 # This map expression is also the return value.
601
  map { my $b_index = $_;
602
    map { my $a_index = $_;
603
      # assign to $a, $b as refs to caller's array elements
604
      (*$caller_a, *$caller_b) = \($A[$a_index], $B[$b_index]);
605
      $op->();    # perform the transformation
606
    }  0 .. $#A;
607
  }  0 .. $#B;
608
}
609

  
583 610
1;

Auch abrufbar als: Unified diff