Hallo ich bin absoluter Noob in Perl und versuche jetzt hier Hilfe zu bekommen.
Also ich spiele Ogame(Browserspiel) und habe ein älteres Allianzverwaltungstool übernommen, das mit keinem konkurrieren kann und es wäre zu schade wenn man das nicht aktualisiert bekommt
Nun versuch ich verzweifelt das das Tool auch die Tausenderpunkte erkennt. Bedeutet, ich kopiere aus einer vorhanden Seite die Werte und es wird dann ins Tool gepastet und in eine DB verwertet und im Tool augegeben.
in dem ersten Fall sieht es so aus:
Mitgliederliste (Anzahl: 8)
Nr. Name Status Punkte Koord Beitritt Online
1 MetaIIica Unischreck 2.460.037 [3:436:5] 2008-09-04 22:16:13 On
Problem ist jetzt da die [ ] und die Tausenderpunkte
Davor war es so:
Mitgliederliste (Anzahl: 8)
Nr. Name Status Punkte Koord Beitritt Online
1 MetaIIica Unischreck 2460037 3:436:5 2008-09-04 22:16:13 On
Das ist das was es im Moment erkennt.
der Code dazu:
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
if ($pasted ne "0") {
my ($player, $points, $koo) = ("", -1, "");
my $id;
foreach (split(/\n/, $pasted)) {
($player, $points, $koo) = ("", 0, "");
my $regex = Ogame::translate(/Nachricht_schreiben/);
if (/$regex/) {
my @foo = split(/\t/);
($player, $points, $koo) = ($foo[1], $foo[4], $foo[5]);
} elsif (/^\d+\t(.*)\t\t.*?\t\s*(\d+)\t\s*([0-9:]+)\s*\t/) {
($player, $points, $koo) = ($1, $2, $3);
} elsif (/^\d+\s+(.*)\s+[\wü]+\s+(\d+)\s+(.*?)\s+/) {
($player, $points, $koo) = ($1, $2, $3);
}
if (($player ne "") && ($points > -1) && ($koo ne "")) {
$sth = $dbh->prepare("select id from $uni{'name'}_allymember where player=?;");
$sth->execute($player);
if ($sth->rows == 0) {
$sth = $dbh->prepare("insert into $uni{'name'}_allymember set player=?, koo=?;");
$sth->execute($player, $koo);
$sth = $dbh->prepare("select id from $uni{'name'}_allymember where player=?;");
$sth->execute($player);
print "new player: $player ($koo)<br>";
}
$id = $sth->fetchrow_array;
$sth = $dbh->prepare("update $uni{'name'}_allymember set timestamp=NOW() where id=?;");
$sth->execute($id);
$sth = $dbh->prepare("select age from $uni{'name'}_allymember_points where player_id=? and age=?;");
$sth->execute($id, $age);
if ($sth->rows == 0) {
$sth = $dbh->prepare("insert into $uni{'name'}_allymember_points set player_id=?, points=?, age=?;");
$sth->execute($id, $points, $age);
} else {
$sth = $dbh->prepare("update $uni{'name'}_allymember_points set points=? where player_id=? and age=?;");
$sth->execute($points, $id, $age);
}
} else {
}
}
}
Beim zweiten habe ich das gleiche Prob:
Neu:
Platz Spieler Allianz Punkte
401 * Hellrazor Nachricht schreiben KoC 2.585.555
Alt:
Platz Spieler Allianz Punkte
401 * Hellrazor Nachricht schreiben KoC 2585555
Code:
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
if (defined($cgi->param('parse'))) {
@lines = split(/\n/, $cgi->param('pasted'));
my $line;
$text .= "<table border>\n";
$text .= "<tr><td colspan=4>Update <small>(wenn leer, ging was schief!)</small></td></tr>\n";
$text .= "<tr><td>Platz</td><td>Spieler</td><td>Ally</td><td>Punkte</td></tr>\n";
my $i = 0;
my $cnt = 0;
foreach $line (reverse @lines) {
next unless ($line =~ /[^\s]/);
my @valuez = split(/\t/, $line);
next unless(defined($valuez[4]));
foreach (@valuez) {
s/^\s*//;
s/\s*$//;
}
$valuez[0] =~ /^(\d+)/;
$valuez[0] = $1;
$valuez[4] =~ s/[^\d]//g;
next unless (defined(($valuez[0])));
next if ($valuez[4] eq "");
next if ($valuez[4] =~ /[^\d]/);
if ($i == 0) {
$sth = $dbh->prepare("select platz from $uni{'name'}_ogame_players order by platz desc limit 1;");
$sth->execute();
my $last = $sth->fetchrow_array;
for ($i = $last + 1; $i <= $valuez[0]; $i++) {
$sth = $dbh->do("insert into $uni{'name'}_ogame_players set platz='$i';");
$cnt++;
}
$i = 1;
}
if (($valuez[0] =~ /(\d+)/) && ($valuez[1] ne "")){
$sth = $dbh->do("update $uni{'name'}_ogame_players set ally='$valuez[3]', punkte='$valuez[4]', name='$valuez[1]', date=NOW() where platz='$1';");
$cnt++;
$text .= "<tr><td>$1</td><td>$valuez[1]</td><td>";
if ($valuez[3] ne "") {
$text .= $valuez[3];
} else {
$text .= " ";
}
$text .= "</td><td>$valuez[4]</td></tr>\n";
} else {
$text .= "<!--tr><td colspan=4>Diese Zeile wird ignoriert: $line</td></tr-->\n";
}
}
$text .= "</table>\n$cnt Zeilen wurden verwendet";
}
dritte wäre das hier:
neu:
Platz Allianz Memb. Punkte
1 * Xel FoCC 19 127.335.357
alt
Platz Allianz Memb. Punkte
1 * Xel FoCC 19 127335357
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
if ($parse_stats == 1) {
my $pasted = $cgi->param('pasted');
if ($pasted eq "") {
print '<center><b style="font-size:20pt; color:#EE0000;">dumm geklickt, was?</b></center><br>';
} else {
my ($place, $ally, $members, $points, $valid) = (0, "", 0, 0, 0);
my @todo = ();
my ($start, $end) = (99999, 0);
foreach (split(/\n/, $pasted)) {
next unless (/^\s*\d+/);
my @arr = split(/\s+/, $_);
if ($#arr >= 5) {
if ($arr[0] > 0) {
$place = shift @arr;
$start = $place if ($place < $start);
$end = $place if ($place > $end);
shift @arr; pop @arr;
$points = pop @arr;
$members = pop @arr;
$ally = join(" ", @arr);
push(@todo, "insert into $uni{'name'}_allystats set ally='$ally', members='$members', points='$points', date=curdate(), place='$place';");
$valid++;
}
} else {
}
}
$sth = $dbh->prepare("delete from $uni{'name'}_allystats where place>=? and place<=? and date=curdate();");
$sth->execute($start, $end);
$sth = $dbh->do($_) foreach (@todo);
$template->param(TMP => "Es konnten $valid Zeilen benutzt werden (Plätze $start - $end).");
}
}
Meine Idee wäre das die Tausenderpunkte und die [] in irgendeiner Form ignoriert werden
Kann mir da einer helfen? Ich sags von vornherein, ich hab nicht die geringste Ahnung von Perl und wäre auch mit externen Lektüre hoffnungslos überfordert. Ich wäre euch dankbar wenn ihr mir da helfen könntet
lg
Sven