Thread kompliziertes unpack (2 answers)
Opened by Damokles at 2005-07-07 01:54

coax
 2005-07-07 08:50
#56063 #56063
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Die vielen substrs kannst du durch unpack ersetzen, dadurch fallen dann auch all die anderen unpacks weg.
Code: (dl )
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} );
 }


Code: (dl )
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

View full thread kompliziertes unpack