_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/unpack - paversti binarinę struktūrą į normalius perl'o kintamuosius
  • unpack TEMPLATE,EXPR

    unpack yra atvirkščias pack: jis paima stringą ir išskleidžia jį į reikšmių sąrašą. (skaliariniame kontekste paprasčiausiai gražinama pirmoji reikšmė.)

    Stringas suskaidomas į gabaliukus, aprašytus TEMPLATE. Kiekvienas toks gabaliukas yra paverčiamas atskirai į reikšmę. Paprastasi arba stringas yra pack rezultatas, arba stringo baitai parodo parodo tam tikrą C struktūrą.

    TEMPLATE turi tokį patį formatą kaip pack funkciją. Štai paprogramė, kuri daro substringus:

        sub substr {
    	my($what,$where,$howmuch) = @_;
    	unpack("x$where a$howmuch", $what);
        }

    ir tada

        sub ordinal { unpack("c",$_[0]); } # same as ord()

    Prie laukų, leidžiamų pack(), galima pridėti lauką su %<number> parodyti, kad norima <number>-bit elememtų checksum rezultato vietoj pačių elementų. Pagal nutylėjimą yra 16-bit checksum. Checksum skaičiuojamas sudedant skaitines išplėstinių reikšmių reikšmes (stringo laukams imama ord($char) suma, bitų laukams, vienetų ir nulių suma).

    Pavyzdžiui, štai pavyzdys, kuris skaičiuoja tą patį skaičių, kaip ir System V sum programa:

        $checksum = do {
    	local $/;  # slurp!
    	unpack("%32C*",<>) % 65535;
        };

    Sekantis efektyviai suskaičiuoja set bitų skaičių bitų vektoriuje:

        $setbits = unpack("%32b*", $selectmask);

    p ir P formatai turėtų būti naudojami atsargiai. Kadangi Perl neturi galimybių patikrinti ar reikšmė, perduota unpack() nurodo į teisingą atminties vietą, perduodant pointerinę reikšmę, kuri nėra aiški visada baigiasi baisiomis pasekmėmis.

    Jei yra daugiau pakavimo kodų arba, jei lauko ar grupės kartojimo skaitliukas didesnis nei tai leidžia įvesties stringas, rezultatas nebus gerai apibrėžtas: kai kuriais atvejais skaitliukas numažinamas arba unpack() duos tuščius stringus arba nulius, arba nutrauks programos vykdymą su klaida. Jei įvesties eilutė yra ilgesnė nei ta, kuri aprašyta TEMPLATE, likutis yr aignoruojamas.

    Žr. pack dėl daugiau pavyzdžių ir patarimų.

algirdas@perl.lt 2005.04.11 - $dabar