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