use strict; use warnings; my @list = qw(zero one two three four); print qq{@list\n}; my @newOrder = (1, 3, 4, 0, 2); my @newList; @newList[@newOrder] = @list; print qq{@newList\n}; @newList = @list[@newOrder]; print qq{@newList\n}; #### zero one two three four three zero four one two one three four zero two #### This code @newList[@newOrder] = @list; Means:- $newList[1] receives $list[0] which is 'zero' $newList[3] receives $list[1] which is 'one' $newList[4] receives $list[2] which is 'two' $newList[0] receives $list[3] which is 'three' $newList[2] receives $list[4] which is 'four' whereas this code @newList = @list[@newOrder]; Means:- $newList[0] receives $list[1] which is 'one' $newList[1] receives $list[3] which is 'three' $newList[2] receives $list[4] which is 'four' $newList[3] receives $list[0] which is 'zero' $newList[4] receives $list[2] which is 'two'