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'