#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use List::Util qw{ shuffle }; my @words = qw( this is a string with a word ); my @order = 0 .. $#words; my %ord; push @{ $ord{ $words[$_] } }, $_ for 0 .. $#words; # <-- Here... @words = shuffle(@words); @order = @ord{@words}; print do { local $" = "\t"; "@words\n" }; say join "\t", map "[@$_]", @order; @order = map shift @$_, @order; # <-- and here. say join ' ', map $words[$_], sort { $order[$a] <=> $order[$b] } @order;