Hier ein soweit funktionierender Code (mit deinen Daten getestet) mit den genannten Verbesserungen.
Ich habe dabei - wie ich es meist mache - die globalen Variablen mit Grossbuchstaben am Wortanfang benannt, damit sie leichter von den lokalen zu unterscheiden sind, ein paar Warnungen ergaenzt und umgeschrieben und weniger hartkodierte Werte benutzt (Dateiname, Serveranzahl).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV_XS;
my $File = 'apo_neu-1.csv';
my $ServerCnt = 6;
my @Entries;
my $Parser = Text::CSV_XS->new({
sep_char => ';',
binary => 1,
});
open (my $InFile,'<', $File) or die "Konnte $File nicht oeffnen: $!";
while (my $line = <$InFile>) {
if($Parser->parse($line)) {
my @fields = $Parser->fields();
# Nur Zahlen von 01 bis 49 im letzten Feld erlaubt
if ($fields[-1] =~ m/^\d{2}$/ and $fields[-1] > 0 and $fields[-1] <= 49) {
push @Entries, [ @fields ];
}
} else {
warn "Fehler beim Parsen in Zeile $. (Inhalt: " . $Parser->error_input() . ")";
}
}
# Sortieren nach dem letzten Arrayfeld
my @Sorted = sort {$a->[-1] <=> $b->[-1]} @Entries;
#-----------------------------------------------------------------------------------------
# Aufteilen der Daten auf $ServerCnt Server
#-----------------------------------------------------------------------------------------
my @Servers;
for my $s (0 .. $ServerCnt-1) {
open ($Servers[$s], '>', "apo_server" . ($s+1) . ".txt")
or die "Konnte Datei apo_server" . ($s+1) . ".txt nicht zum Schreiben oeffnen: $!";
}
my $ActServer = 0;
for my $i (0 .. $#Sorted) {
# Zeile fuer Server Nr. $act_server+1 ausgeben
print { $Servers[$ActServer] } join(" ", @{$Sorted[$i]}), "\n";
# Naechster Server
$ActServer = (($ActServer+1) % $ServerCnt);
}
close $_ for @Servers;
#-----------------------------------------------------------------------------------------