use strict; use warnings; my $before = [qw(1 2 3 4 5 6 7 8 9 10)]; my $after = [qw(1 2 3 4 6 7 5 8 9 10)]; # Find the first and last that are out of position my ($lo_1, $hi_1); for (0..$#$before) { if ($before->[$_] != $after->[$_]) { (defined $lo_1 ? $hi_1 : $lo_1) = $_; } } # If the first item is out of order relative to the one following it, # it has been moved from higher up; otherwise, the move was in the other direction if ($after->[$lo_1+1] < $after->[$lo_1]) { print "Moved element $hi_1 to $lo_1\n"; } else { print "Moved element $lo_1 to $hi_1\n"; }