_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/seek - pakeisti failo pointerio vietą atsitiktinio priėjimo I/O

  • seek FILEHANDLE,POSITION,WHENCE

    Nustato FILEHANDLE poziciją, kaip ir fseek iškvietimas iš stdio . FILEHANDLE gali būti išsireiškimas, kurio reikšmė įvardija I/O jungtį tarp Perl proceso ir operacinės sistemos (filehandle). WHENCE reikšmės yra 0 nustatant naują poziciją baitais į POSITION, 1 , kai nustatoma į šiuo metu esančią poziciją plius POSITION ir 2 - nustatyti į EOF plius POSITION (dažniausiai neigiama). Aprašant WHENCE galima naudoti konstantas SEEK_SET , SEEK_CUR ir SEEK_END (failo pradžia, dabartinė pozicija, failo pabaiga) iš Fcntl modulio. Gražina 1 sėkmės atveju, kitu atveju - 0 .

    Atkreipkite dėmesį, kad pozicija nustatoma baitais: net jei "filehandle" buvo nustatyta dirbti su simboliais (pvz. naudojant :utf8 open layer), tell() gražins baitų, o ne baitų ofsetus, nes įgyvendinant pastarajį variantą, seek() ir tell() būtų verčiami ganėtinai lėtai).

    Jei norite nustatyti failą naudojimui su sysread ar syswrite, nenaudokite seek--buferizacija neprognozuojamai paveikia pozicijas. Tokiam atvejui reiktų naudoti sysseek .

    Dėl ANSI C taisyklių ir sustabarėjimo, kai kuriose sistemose reikia naudoti seek kiekvienąkart pereinant iš skaitymo į rašymą ir atvirkščiai. Be visko, to rezultate gali būti iškviestas stdio clearerr(3). WHENCE su reikšme 1 (SEEK_CUR ) naudingas nekeičiant pozicijos faile:

        seek(TEST,0,1);

    Tai taipogi naudinga aplikacijoms, emuliuojančioms tail -f . Nuskaitant pasiekus EOF ir trumpam "užmigdžius" skriptą (sleep), gali tekti vėl krapštytis su seek(), kaitaliojant parametrus.seek nekeičia dabartinės pozicijos, tačiau išvalo failo pabaigos reikšmę taip, kad kitam <FILE> Perl vėl mėgina kažką nuskaityti. Tikimės.

    Jei tai neveikia (kokio nors bjauraus IO įgyvendinimo dėka), galima išmėginti kažką panašaus į tai:

        for (;;) {
    	for ($curpos = tell(FILE); $_ = <FILE>;
                 $curpos = tell(FILE)) {
    	    # Ieškome ko nors ir rašome į failus
    	}
    	sleep($kuriam_laikui);
    	seek(FILE, $curpos, 0);
        }
algirdas@perl.lt 2005.04.11 - $dabar