unpack è l'inverso di pack: prende una stringa e la espande in una lista di
valori. (In contesto scalare restituisce solamente il primo valore generato).
La stringa viene divisa in pezzi come descritto da TEMPLATE. Ogni pezzo viene convertito
separatamente in un valore. Solitamente, la stringa è un risultato di pack,
oppure i suoi byte rappresentano una struttura C di un qualche tipo.
TEMPLATE ha lo stesso formato che nella funzione pack. Ecco una subroutine che trova
una sottostringa:
sub substr {
my($cosa,$dove,$quanto) = @_;
unpack("x$dove a$quanto", $cosa);
}
e poi c'è:
sub ordinale { unpack("c",$_[0]); } # come ord()
In aggiunta ai campi permessi da pack(), potete far precedere a ciascun campo un
%<numero> per indicare che desiderate un checksum di <numero>-bit degli elementi
anziché i reali elementi. Il checksum predefinito è di 16 bit.
Il checksum è calcolato sommando i valori numerici dei valori espandi (per le
stringhe viene considerata la somma di ord($carattere), per i bit la somma degli zero
e degli uno).
Per esempio, il seguente codice calcola lo stesso numero del programma sum di System V:
$checksum = do {
local $/; # slurp!
unpack("%32C*",<>) % 65535;
};
Il seguente codice conta in maniera efficiente il numero di bit impostati in un vettore di bit:
$bitimpostati = unpack("%32b*", $maschera_di_selezione);
I formati p e P devono essere usati con cura. Dato che Perl non ha alcun modo di
controllare se il valore passato ad unpack() corrisponda ad una valida locazione di
memoria, passare un puntatore che non si è certi sia valido probabilmente
porterà a conseguenze disastrose.
Se ci sono più codici per pack oppure se l conteggio delle ripetizioni di un
campo o di un gruppo è maggiore di quanto il rimanente input permetta, il
risultato non è ben definito: in alcuni casi, il conto delle ripetizioni viene
decrementato, oppure unpack() produrrà stringhe nulle o zeri oppure
terminerà con un errore. Se la stringa in input è più lunga di
quella descritta da TEMPLATE, la parte in più viene ignorata.
Consultate pack per ulteriori esempi e note.