_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/binmode - paruošia binarinį failą I/O
  • binmode FILEHANDLE, LAYER
  • binmode FILEHANDLE

    Parengia FILEHANDLE'ui būti nuskaitytam ar įrašytam dvejatainiu ar teksto režimu sistemose, kuriose "run-time" bibliotekos skiria binarinius ir tekstinius failus. Jei FILEHANDLE yra išsireiškimas, reikšmė paimama kaip filehandle'o pavadinimas. Gražina true sėkmės atveju, kitu atveju - undef ir nustato $! (errno/klaidos numerį).

    Kai kruiose sistemos (bendrai imant, DOS ir Windows) binmode() nebūtinas, kai nedirbama su tekstiniais failais. Dėl portabilumo, visgi, patartina visada naudoti kada to gali prireikti. Taip pat galima nustatyti I/0 UTF-8 pagal nutylėjima būti užkoduotama Unicode, o ne baitais.

    Kitais žodžiais tariant: nežiūrint platformos, reiktų naudoti binmode() dvejetainiams duomenims, kaip pvz. paveixliukams.

    Jei aprašytas LAYER, jis yra vieno string'o pavidalo, bet gali susidėti iš kelių direktyvų. Šios nuorods keičia failo jungties (handle'o) elgsena. Prasmė yra, jei LAYER nurodomas naudojant binmode tekstiniams failams.

    Jei LAYER praleistas arba aprašytas kaip :raw filehandle'as padaromas tinkamu dvejetainės informacijos perdavimui. Į tai įeina galimos CRLF transliacijos išjungimas ir jos pažymėjimas baitais (o ne Unicode simboliais). Pažymėtina, kad, nepaisant to, kas gali būti duodama suprasti knygoje "Programming Perl" (The Camel) ar kur kitur, :raw nėra tiesiog :crlf inversija -- kiti layer'iai, kurie paveiktų dvejetainæ srauto prigimtį, taip pat išjungti. Žiūrėti PerlIO, perlrun ir pasvarstymus apie PERLIO environment kintamajį.

    :bytes , :crlf ir :utf8 ir bet kokios kitos :... formos direktyvos yra vadinamos I/O layer'iais. open pragma gali būti naudojama sukurti I/O layer'ius pagal nutylėjima. Žiūrėti open.

    LAYER parametras binmode() funkcijoje aprašytas kaip "DISCIPLINE" "Programming Perl, 3rd leidime". Visgi, nuo šios knygos išleidimo, daug kam žinomo kaip "Camel III", funkcionalumo pavadinimų susitarimas pasikeitė nuo "discipline" į "layer". Visa paskutinių Perl versijų dokumentacija nurodo "layers'us" , o ne "disciplines". Dabar grįžkime prie tvarkingai planuotos dokumentacijos...

    Pažymėti FILEHANDLE kaip UTF-8, naudojama :utf8 .

    Bendrai imant, binmode() turėtų būti iškviesta po open(), bet prieš bet kokį filehandle'o daroma I/O. Binmode() iškvietimas šiaip jau ignoruos bet kokius laukiančius buferintus išvedimo duomenis (ir, ko gero, įvedimo) handle. Išimtis tam yra :encoding layer'is, kuris pakeičia pagal nutylėjima esantį simbolių užkodavima handle. Žiūrėti open. :encoding layer'is kartais turi būti iškviestas mid-stream'e ir šitas neignoruos srauto. :encoding taip pat besalygiškai padeda į paties savæs viršų :utf8 layer'į, nes viduje Perl operuos UTF-8 užkoduotais Unicode simboliais.

    Operacinė sistema, įrenginių tvarkyklės, C bibliotekos ir Perl run-time sistema veikia kartu, kad leistų programuotojui traktuoti viena simbolį (\n ) kaip eilutės pabaiga, nepriklausoma nuo išorinės reprezentacijos. Daugumoje operacinių sistemų, joje esančių failų reprezentacija sutinka su vidine reprezentacija, bet kai kuriose platformose, išorinė \n reprezentacija susideda iš daugiau nei vieno simbolio.

    Mac OS, visos Unix šakos ir Stream_LF failai VMS naudoja viena simbolį kiekvienai eilutei išorinei teksto reprezentacijai (net jei tas vienas simbolis yra CARRIAGE RETURN Mac OS ar LINE FEED Unix'e ir daugumoje VMS failų). Kitose sistemose kaip OS/2, DOS ir įvairių MS-Windows, programa mato \n kaip paprasta \cJ , bet kas laikoma tekstiniuose failuose yra du simboliai \cM\cJ . Tai reiškia kad jei nenaudojama binmode() tose sistemose, \cM\cJ seka diske bus paversta į \n įvedimo metu ir bet kurį \n programoje pavers atgal į \cM\cJ išvedime. To ir norima tekstiniuose failuose, bet gali būti pražūtinga binariniams failams.

    Kita binmode() naudojimo pasėkmė (kai kuriose sistemose) yra ta, kad specialūs failo pabaigos (end-of-file) žymekliai bus matomi kaip dalis duomenų srauto. Microsoft šeimos sistemoms tai reiškia, jei binariniuose duomenyse yra \cZ , I/O posistemė atsižvelgs į tai kaip failo pabaiga, nebent būtų naudojama binmode().

    binmode() yra ne tik svarbi readline() ir print() operacijoms, bet taip pat naudojant read(), seek(), sysread(), syswrite() ir tell() (žiūrėti perlport dėl daugiau detalių). Taip pat $/ ir $\ kintamuosius perlvar kaip rankiniu būdu nusatyti įvedimo ir išvedimo eilučių atskyrėjų sekas.

algirdas@perl.lt 2005.04.11 - $dabar