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);
}