my @datei_to_sort = map {chomp; $_} (); my $level_to_sort = 20; my $spalte_to_sort = 5; print Dumper in_three_chunks(\@datei_to_sort, $level_to_sort, $spalte_to_sort); sub in_three_chunks { my $datei_ts = shift; my $level_ts = shift; my $spalte_ts = (shift)-1; return unless ref $datei_ts or not $level_ts =~ /^\d+$/; my %parted = ( before => [], matching => [], after => [] ); for my $zeile (@$datei_ts) { my $spalte = [split /;/, $zeile]; push @{$parted{'matching'}}, $zeile, $spalte->[$spalte_ts] and next if $spalte->[2] == $level_ts; unless (@{$parted{'matching'}}) { push @{$parted{'before'}}, $zeile; } else { push @{$parted{'after'}}, $zeile; } } #print $parted{'matching'}->[1]; sort { $a->($parted{'matching'}->[1]) <=> $b->($parted{'matching'}->[1])} %parted; return \%parted; } __DATA__ Zeile1;;10;;;; Zeile2;;11;;;; Zeile3;;20;;600;; Zeile4;;20;;500;; Zeile5;;20;;800;; Zeile6;;20;;700;; Zeile7;;30;;;; Zeile8;;40;;;;