#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @array1 = ("A","A","A","B","C"); my @array2 = ("a","b","c","d","e"); my %seen; my @tmp; for my $i ( 0.. $#array1 ){ push @tmp, $array1[$i] unless exists $seen{ $array1[$i] }; push @{ $seen{ $array1[$i] } }, $i; } @array1 = @tmp; undef @tmp; for my $j ( 0..$#array1 ){ my $elem = $array1[$j]; $tmp[$j] = join '', @array2[ @{ $seen{$elem} } ]; } @array2 = @tmp; print Dumper \@array1, \@array2;