Если не заморачиваться с хэшами, многомерными массивами, объектами и т.п.

то вот простой вариант:

Код:
$datafile = "Ваня|10|Москва\n".
"Петя|5|Уфа\n".
"Иван|7|Питер";
@data = split(/\r?\n/,$datafile);
@sortdata = &mysort(1,1,0,@data);
...
exit;
sub mysort {
my $field = shift; # - номер поля для сортировки
my $type = shift; # - тип поля (0-стринг, 1-число)
my $revers = shift; # - 1=обратная сортировка
my @result = @_;
if ($type) {
@result = sort {
my @data1 = split(/\|/,$a);
my @data2 = split(/\|/,$b);
return $data1[$field]<=>$data2[$field];
} @result;
} else {
@result = sort {
my @data1 = split(/\|/,$a);
my @data2 = split(/\|/,$b);
return ($data1[$field] lt $data2[$field]) ? -1 : ($data1[$field] gt $data2[$field]) ? 1 : 0;
} @result;
}
@result = reverse @result if ($revers);
return @result;
}