Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision f30b6f52

Von Sven Schöling vor etwa 16 Jahren hinzugefügt

  • ID f30b6f52b1684388cebc0878b73c39c6b1040749
  • Vorgänger 17b87579
  • Nachfolger ecd0ca84

cross von common.pl nach MoreCommon verschoben.

Unterschiede anzeigen:

SL/MoreCommon.pm
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;
......
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;
bin/mozilla/common.pl
$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;

Auch abrufbar als: Unified diff