L'ordinamento per campi di per se è semplice, però come ha fatto notare Mich_ il codice che hai postato ha confuso le idee non poco.
Allora quello che penso di aver capito:
- hai un file di testo con un record per riga
- ogni riga ha 24 campi
- tu vuoi stampare (o comunque ordinare in un array di array) i record ordinati per in campo #5, ma solo quelli che soddisfano la condizione campo #2 = un elemento di @FAM
il codice sulla base di questo:
open (DAT, "$db_file_name") || die "Non posso aprire $db_file_name: $!\n";
while (<DAT>) {
chomp;
@campo = split /;/;
push (@data, [@campo]) if $FAM[$i] eq $campo[2];
}
close (DAT);
@sorted = sort { $a->[5] cmp $b->[5] } @data;
print "@$_\n" foreach @sorted;