use strict; use warnings; use Time::HiRes 'time'; my @tokens = ('aaa'...'zzz'); my $start = time; sub build_regex { my ($token) = @_; chop $token; $token .= 'a'; } my %result; foreach my $token ( @tokens ) { my $regex = build_regex($token); my @line_results = grep { $_ ne $token and /$regex/ } @tokens; $result{$token} = \@line_results if @line_results; }; printf "duration: %0.03f seconds\n", time - $start; print scalar(keys %result), "\n"; # 16900