use warnings; use strict; use Benchmark qw/cmpthese/; use Algorithm::Loops qw/NestedLoops/; use Test::More 'no_plan'; my @outer = ( 'aa' .. 'jj' ); my @inner = ( 'AA' .. 'JJ' ); my $count = 100; my $control = \&sliced; foreach my $compare ( \&for_each, \&nested_loops, \&mapped ) { is_deeply( $compare->( \@outer, \@inner ), $control->( \@outer, \@inner ), "Control matched." ); } cmpthese( $count, { foreach => sub{ my $res = for_each( \@outer, \@inner ) }, NestedLoops => sub{ my $res = nested_loops( \@outer, \@inner ) }, mapped => sub{ my $res = mapped( \@outer, \@inner ) }, sliced => sub{ my $res = sliced( \@outer, \@inner ) }, } ); sub for_each { my %hash; foreach my $out ( @{ $_[0] } ) { foreach my $in ( @{ $_[1] } ) { $hash{$out}{$in} = 1; } } return \%hash; } sub nested_loops { my %hash; NestedLoops( [ $_[0], $_[1] ], sub { $hash{ $_[0] }{ $_[1] } = 1; } ); return \%hash; } sub mapped { my %hash = map{ $_ => { map { $_ => 1 } @{ $_[1] } } } @{ $_[0] }; return \%hash; } sub sliced { my %hash; @{ $hash{$_} }{ @{ $_[1] } } = (1) x @{ $_[1] } for @{ $_[0] }; return \%hash; }