Die vielen
substrs kannst du durch unpack ersetzen, dadurch fallen dann auch all die anderen
unpacks weg.
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
#!/usr/bin/perl
use strict;
use warnings;
use vars qw(@chars);
# Beispieldatensatz
my $msg = '1111' . '2222' . '3333' . '4444' . 'A' . '_' x 25 .
'55' . '66' . '77' . '88' . '_' x 2 .
'B' . '_' x 5 . 'C' . '_' x 11 .
'D' . '_' x 3 . 'E' x 24 .
'F' . 'G' . 'H' . 'I' . 'J' . 'K' . 'L' . '_';
print("Ein Datensatz: $msg\n\n");
# den gleichen Datensatz noch 2mal anghaengen
$msg .= $msg x 2;
# --- Begin interessanter Teil
# String in Datensaetze splitten
my(@records) = $msg =~ /(\w{106})/g;
foreach my $record ( @records ) {
my(%fields, $num);
(@fields{qw(ID exp zenny exp_job lv_job hp hp_max sp sp_max
jobID lv hair_color name str agi vit int dex luk )}, $num)
= unpack("V V V V C x25 v v v v x2 C x5 C x11 C x3 Z24 C C C C C C C", $record );
$chars[$num] = \%fields;
}
# --- Ende interessanter Teil
# Datensatz mit Index 76 ausgeben
foreach my $key ( keys %{ $chars[76] } ) {
printf("%s\t%s\n", $key, $chars[76]->{$key} );
}
unpack("V V V V C x25 v v v v x2 C x5 C x11 C x3 A24 C C C C C C C", $record );
Wie du siehst sind die Einsen hinter V und C ueberfluessig jedes Zeichen steht schon fuer 'einmal'. Die Angabe x25 steht fuer 25 Nullbytes die dann in der Ergebnisliste auch nicht auftauchen, so kannst du leicht eine bestimmte Anzahl Zeichen ueberspringen.
Grusz Christian.
edit: Der alte
$forumbeitrag =~ s/\_\_.+?\_\_//sg;-Bug :angry:\n\n
<!--EDIT|coax|1120712667-->
,,Das perlt aber heute wieder...'' -- Dittsche