2009-07-22 10 views
0

J'ai un Wich struct contient:En Perl, comment puis-je décompresser plusieurs variables?

struct mystruct{ 
    int    id[10]; 
    char    text[40]; 
    unsigned short int len; 
}; 

Et je suis en train de déballer dans une seule ligne, quelque chose comme ceci:

my(@ids,$text,$length) = unpack("N10C40n",$buff) ; 

Mais tout va au premier réseau (@ IDs), j'ai essayé modèles comme "N10 C40 n" et "(N10)(C40)(n)" Donc, soit cela ne peut pas être fait ou je n'utilise pas la bonne chaîne de modèle.

Remarque: J'utilise des données big endian.

Des indices?

Répondre

7

Dans l'affectation de liste, le premier tableau ou le premier hachage va tout manger (comment savoir où s'arrêter?). Essayez ceci:

my @unpacked  = unpack "N10Z40n", $buff; 
my @ids    = @unpacked[0 .. 9]; 
my ($text, $length) = @unpacked[10, 11]; 

vous pourriez aussi dire

my @ids; 
(@ids[0 .. 9], my ($text, $length)) = unpack "N10Z40n", $buff; 
+1

Avec que je ne reçois pas de C40 au texte de $, Au lieu de cela, je vais d'abord C en $ texte et en second lieu C à $ longueur –

+0

Hmm, j'avais supposé que votre déballage était correct, laissez-moi jeter un coup d'œil. –

+1

Vous voulez probablement 'A40' au lieu de' C40'. 'A40' est une chaîne d'une quarantaine de caractères, 'C40' est quarante octets individuels. Vous pouvez également vouloir 'Z40' qui serait mieux en accord avec l'idée que' text' est une chaîne de style C (c'est-à-dire une séquence de caractères de fin nulle). –

1

Si l'ordre du @ids n'a pas d'importance:

my ($length, $text, @ids) = reverse unpack("N10C40n",$buff) ; 
+0

Idée intéressante, je n'avais pas considéré cela. –

+0

@Chas. Il est susceptible d'être inférieur à votre solution en termes de vitesse et pour les listes assez petites retournées par 'décompresser ', cela pourrait être plus simple. –

Questions connexes