That will work, but as tilly pointed out, the problem is with the MergeSort code being named. This aught to work with the fewest changes to your code:
sub Merge(@) {
my @array = @_;
local $MergeSort = sub { ### Anonymous code ref. ###
my $first = shift;
my $last = shift;
if ($last>$first) {
my $mid = int(($last+$first)/2);
$MergeSort>($first, $mid);
$MergeSort>($mid+1, $last);
my @b;
@b = ( @array[$first..$mid], @array[reverse($mid+1..$last)] );
my ($i, $j, $k) = (0, $last$first, $first);
for (; $k<=$last; $k++) {
$array[$k] = ($b[$i]<$b[$j]) ? $b[$i++] : $b[$j];
}
}
}
$MergeSort>(0, $#array);
return @array;
}
