use 5.026; use warnings; use Data::Dumper; my @strings = qw{ aaaaaaaaabababacbbbbbbbaccaabc aaaaaaaaaaaaaaaaacbbbbbbbaaaca aaaaaaaaabaaaaabbaaaaabaaccccc }; homogenise( \ @strings ); print Data::Dumper->Dumpxs( [ \ @strings ], [ qw{ *strings } ] ); sub homogenise { my $raStrings = shift; my $len = length $raStrings->[ 0 ]; foreach my $string ( @{ $raStrings } ) { $string = { original => $string }; $string->{ byLine } = join q{}, sort split m{}, $string->{ original }; } my $allSorted = join q{}, sort map { split m{}, $_->{ original } } @{ $raStrings }; my $idx = 0; $raStrings->[ $idx ++ ]->{ bySet } = $_ for unpack qq{(a$len)*}, $allSorted; } #### @strings = ( { 'bySet' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'original' => 'aaaaaaaaabababacbbbbbbbaccaabc', 'byLine' => 'aaaaaaaaaaaaaaabbbbbbbbbbbcccc' }, { 'byLine' => 'aaaaaaaaaaaaaaaaaaaaabbbbbbbcc', 'original' => 'aaaaaaaaaaaaaaaaacbbbbbbbaaaca', 'bySet' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaabbb' }, { 'byLine' => 'aaaaaaaaaaaaaaaaaaaaabbbbccccc', 'bySet' => 'bbbbbbbbbbbbbbbbbbbccccccccccc', 'original' => 'aaaaaaaaabaaaaabbaaaaabaaccccc' } );