Perl, kuidas tekstifailist andmeid lugeda. Faili sisend ja väljund

Perl pakub unaarsete operatsioonide komplekti, mis tagastavad sisendstruktuuri ainult ühe välja väärtuse. Neid toiminguid nimetatakse dokumentatsioonis "-X-operatsioonideks", kuna nende nimed koosnevad sidekriipsust, millele järgneb üks märk. Kõik need on ühekordse nimega toimingud ja neil on keerulistes avaldistes oma prioriteet.

Täielik unaarsete failide kontrollimise toimingute loend

R Faili saab lugeda efektiivse uid/gid -w Tõhusa uid/gid abil saab kirjutada faili -x Faili saab käivitada efektiivse uid/gid abil -o Faili omanik on efektiivne uid/gid - R Faili saab lugeda kehtiva uid/gid abil -W Faili kirjutamine võib olla kehtiv uid/gid -X Faili saab käivitada kehtiva uid/gid -O Faili omanik on kehtiv uid/gid -e Fail on olemas -z Faili suurus on null -s Faili suurus on nullist erinev (tagastab suuruse) -f Fail on tavaline ( tavaline) fail -d Fail on kataloog -l Fail on sümboolne link -p Fail on nimega programmi toru (FIFO) või kontrollitav käepide on seotud programmi toruga -S Fail on pesa -b Fail on spetsiaalne plokifail -c Fail on erimärgifail -t Faili deskriptor, mis on seotud terminaliga -u Faili setuid bit set - g Faili määraminegidgid bitikomplekt -k Faili kleepuv bittide komplekt -T Fail on tekstifail -B Fail on binaarne (teksti vastand) -M Faili vanus päevades programmi käivitamisel -A Sama faili viimase juurdepääsu ajal - C Sama faili inode viimase muutmise aja kohta

Unaartehteid rakendatakse failinime sisaldavale stringile, avaldisele, mille hinnang on failinimi, või Perli failikirjeldusele. Kui operatsiooniparameetrit pole määratud, testib see faili, mille nimi sisaldub erimuutujas $_. Iga failiatribuudi kontrollimise toiming tagastab 1, kui failil on vastav atribuut, tühja stringi "" vastasel juhul ja määramata väärtus undef, kui määratud faili pole olemas.

Paar sõna teksti- ja binaarfailide tuvastamise algoritmi kohta (operatsioonid -T ja -B). Need toimingud analüüsivad faili esimese ploki sisu "kummaliste" märkide – ebatavaliste paojärjestuste või kõrge bittide arvuga baitide – olemasolu suhtes. Kui leitakse piisavalt suur hulk sarnaseid märke (üle 30%), siis loetakse faili binaarseks, muidu tekstiks. Iga faili, mille esimene plokk on tühi, loetakse binaarseks.

Kui neid toiminguid rakendatakse Perli failideskriptoritele, kontrollitakse I/O puhvri sisu, mitte faili esimest plokki. Mõlemad failideskriptoritele rakendatud toimingud tagastavad tõeväärtus Tõene, kui seotud faili deskriptor on tühi või seatud faili lõppu.

Ühenimeliste failide kontrollimise operatsioonide sooritamisel kutsutakse tegelikult kaudselt välja funktsioon stat() ja selle arvutamise tulemused salvestatakse vahemällu, mis võimaldab kasutada spetsiaalset faili deskriptor _ kiirendada mitu kontrolli fail:

If(-s("failinimi") && -T _) ( # Tehke midagi nullist erineva tekstifailide jaoks. . . . . . . . . . . . . . . .

chdir

Muutke praegune töökataloog parameetri EXPRESSION väärtusega määratud kataloogiks. Kui parameeter jäetakse välja, kodukataloog muutub aktuaalseks. Tagastab tõene, kui praeguse kataloogi asendamise toiming õnnestus, muul juhul Väär.

Chdir [EXPRESSION]

chmod

chmodi LOEND

Funktsioon chmod() muudab talle parameetrina antud loendis olevate failide õigusi. Selle loendi esimene element peab olema kolmekohaline kaheksandnumber, mis määrab omaniku, omanikurühma kasutajate ja teiste kasutajate juurdepääsuõigused. Iga kaheksandnumber määrab ülaltoodud kasutajarühmade jaoks õiguse faili lugeda, faili kirjutada ja seda käivitada (kui fail esindab käivitatavat programmi). Bittide komplekt selle binaarsed esitused kajastavad vastavaid failiõigusi. Näiteks kui kõik kolm bitti on seatud (kaheksandikarv 7), siis vastaval kasutajagrupil on kõik loetletud õigused: nad saavad failist lugeda, faili kirjutada ja seda täita. Väärtus 6 määrab lugemis- ja kirjutamisõiguse, 5 võimaldab failist lugeda, seda käivitada, kuid ei luba sellesse faili kirjutada jne. Tavaliselt luuakse mittekäivitatav fail juurdepääsurežiimiga 0666 – kõik kasutajad saavad faili lugeda ja sinna infot kirjutada, käivitatav fail – režiimiga 0777. Kui faili omanik soovib piirata kirjutamist nende kasutajate failiga, kes ei ole tema rühm, siis tuleks täita järgmine avaldus:

Chmod 0664, "file.dat";

Funktsiooni chmod() tagastusväärtus on sarnaselt funktsioonile chown() nende failide arv loendist, mille puhul lubade muutmise toiming edukalt lõpule viidi.

DOS-i ja Windowsi operatsioonisüsteemide puhul on oluline ainult omaniku juurdepääsurežiimide seadistus.

chown

chown LIST

Iga kasutajat, kes loob oma faili, loetakse selle omanikuks. Saate muuta Perli skripti faili omanikku funktsiooni chown() abil. Selle funktsiooni argumendiks on loend, mille kaks esimest elementi peavad esindama numbrilisi identifikaatoreid uid ja gid. Loendi ülejäänud elemendid on nende failide nimed, mille omanikku muudetakse. See funktsioon tagastab failide arvu, mille omaniku ja rühma muutmise toiming õnnestus.

Näide:

@list = (234, 3, "file1.dat", "file2.dat"); $number = chown(@loend); hoiatage "Kõik failid pole omanikku vahetanud!" if $number != @list-2;

Faili omanikku saab muuta ainult omanik või superkasutaja (tavaliselt süsteemiadministraator). UNIX süsteemid. Operatsioonisüsteemides koos failisüsteem peale UNIXi (DOS, Windows) see funktsioon töötab, kuid selle sätted ei mõjuta juurdepääsu failile.

chroot

Määrab uue juurkataloogi kõigi kasutaja protsesside ja selle alamprotsesside suhteliste (alates kaldkriipsuga "/") failinimede jaoks. Ei muuda praegust töökataloogi. Parameetri puudumisel kasutatakse erimuutuja $_ väärtust. Helistada saab ainult superkasutaja.

Chroot DIR_NAME

Sulge

sulge DESCRIPTOR

Pärast failiga töötamise lõpetamist suletakse see funktsiooniga close(). Selle funktsiooni ainus valikuline parameeter on failiga seotud käepide.

See funktsioon tagastab väärtuse Tõene, kui I/O puhvri tühjendamine õnnestus ja süsteemifaili käepide suleti. Ilma parameetrita kutsutud sulgemisfunktsioon sulgeb funktsiooni select() poolt määratud praeguse käepidemega seotud faili.

Kui ilmnevad faili sulgemise vead, saab neid tuvastada spetsiaalse muutuja $! abil: close (FILE) or die "Viga faili sulgemisel: $!";

suletud

Sulgeb parameetriga DECRIPTOR määratud kataloogipidemega seotud kataloogi. Tagastab tõeväärtuse True, kui kataloog suleti edukalt.

Suletud KÄEPIDE

fcntl

Rakendab Unixi süsteemikäsku fcntl(2). Enne kasutamist peate pääsema juurde süsteemikonstantide definitsioonidele käsuga use Fcntl.

Tagastusväärtus: kui süsteemi funktsioon tagastab -1, siis on Perli funktsioon määratlemata; kui süsteemifunktsioon tagastab 0, siis Perli funktsioon tagastab stringi "0, kuid tõsi"; kui süsteemifunktsioon tagastab mõne muu väärtuse, tagastab Perli funktsioon sama väärtuse.

Fcntl KÄEPIDE, FUNKTSIOON, SKALAAR

glob

Tagastab praegusest kataloogist leitud failid, mille nimed vastavad antud mustrile (kasutades Unixi metamärke "*","?"). Avaldise väärtus peab olema string, mis sisaldab failinimede mustrit.

Glob EXPRESS

ioctls

Rakendab Unixi ioctl(2) süsteemikäsku. Enne kasutamist peate pääsema juurde süsteemikonstantide definitsioonidele. nõuda avaldust"ioctl.ph";

Tagastusväärtus:

  • kui süsteemifunktsioon tagastab -1, siis on Perli funktsioon määratlemata;
  • kui süsteemifunktsioon tagastab 0, siis Perli funktsioon tagastab stringi "0, kuid tõsi";
  • kui süsteemifunktsioon tagastab mõne muu väärtuse, tagastab Perli funktsioon sama väärtuse.
fcntl KÄEPIDE, FUNKTSIOON, SKALAAR

link

Link VANA, UUS

lstat

Tagastab faili sümboolse lingi inode struktuuri väljaväärtuste loendi. Kui parameeter on välja jäetud, kasutatakse erimuutuja $_ väärtust.

lstat [DECRIPTOR] lstat [EXPRESSION]

Kasutatakse sümboolsete linkide kohta teabe saamiseks. Tagastab välja väärtuste loendi lingi enda inode struktuuri jaoks, mitte faili, millele see viitab. See funktsioon töötab sarnaselt funktsiooniga stat().

mkdir

Loob uue kataloogi parameetriga DIRECTORY määratud nimega ja parameetriga MODE määratud juurdepääsurežiimiga. Tagastab tõeväärtuse Tõene eduka kataloogi loomise korral, muul juhul väära ja $! sisestatakse veateade.

Mkdir KATALOOG, MODE

avatud

ava DECRIPTOR, FILE_NAME; avatud KÄEPIDE;

Perli programmis failile juurdepääsuks on vaja käepidet. Funktsiooni open() kasutatakse käepideme loomiseks. Kui parameetrites määratud failinimega tehakse avamisoperatsioon, avatakse vastav fail ja luuakse sellele failile käepide. Avaldist saab kasutada faili deskriptorina – selle väärtus on deskriptori nimi. Failinimi antakse otse stringliteraalina või avaldisena, mille väärtus on string. Avaoperatsioon ilma failinimeta avab faili, mille nimi sisaldub skalaarmuutujas $DECRIPTOR, mis ei saa olla funktsiooniga my() määratletud leksikaalne muutuja.

Näide:

#! perl -w $var = "out.dat"; $FILE4 = "fail4.dat"; ava FILE1, "in.dat"; # Faili nime annab string open FILE2, $var; # Avatud FILE3 poolt antud failinimi "/perlourbook/01/".$var; # Failinime hinnatakse avatud FILE4 lauses; # Failinimi muutujas $FILE4

Kui failinimi on mittetäielik, avatakse fail käsuga antud nimi ja asub Perli programmiga samas kataloogis. Saate määrata faili täisnime, kuid pidage meeles, et see sõltub kasutatavast operatsioonisüsteemist. Näiteks Windowsis peate määrama draivi nime: d:/perlbook/file1.doc

Iga faili saab avada ühel järgmistest režiimidest: lugeda, kirjutada või faili lõppu lisada. Selleks lisatakse failinimele vastav eesliide:

  • < (чтение)
  • > (rekord)
  • >> (lisa)

Kui eesliide jäetakse välja, avatakse fail vaikimisi lugemisrežiimis.

Teabe kirjutamine kirjutusrežiimis avatud faili toimub faili alguses, mis viib selles sisalduva teabe hävitamiseni enne selle avamist.

Lisamisrežiimis avatud failis sisalduvat teavet ei hävitata, uued kirjed lisatakse faili lõppu.

Kui faili kirjutamis- või lisamisrežiimis avamisel määratud nimega faili ei eksisteeri, luuakse see, mis eristab neid faili avamisrežiime lugemisrežiimist, milles fail peab olemas olema. Vastasel juhul avamine nurjub ja vastavat käepidet ei looda.

Perl võimaldab teil faili avada veel ühes režiimis - lugemis-/kirjutusrežiimis.

Selleks enne loetud eesliidet<, записи >või lisades >> peaks panema + märgi.

  • +< - сохраняют содержимое открываемого файла
  • +> - esmalt tühjendab avatud faili sisu
  • +>> - salvestage avatud faili sisu, faili kirjutamine toimub alati faili sisu lõpus

avatud kataloog

Avab kataloogi, mille nimi on võrdne parameetri EXPRESSION väärtusega, ja seostab selle parameetriga DECRIPTOR määratud käepidemega. Kataloogide deskriptorite nimed salvestatakse Perli nimetabeli algsesse nimeruumi.

Opendir HANDLE, EXPRESS

loe link

Tagastab EXPRESSIONiga määratud sümboolse lingi väärtuse, kui opsüsteem on rakendanud sümboolseid linke; muidu - saatuslik viga. Kui sümboolse lingi väärtuse hankimisel süsteemi vead, tagastab määratlemata väärtuse ja erimuutujasse $! sisestatakse veateade. Kui parameeter on välja jäetud, kasutatakse muutuja $_ väärtust.

loe link [EXPRESSION]

ümber nimetada

Nimetab faili ümber. Tagastab 1, kui ümbernimetamine õnnestus, 0 muul juhul.

Nimeta OLD_NAME ümber, NEW_NAME

stat

UNIX-i failistruktuuris salvestatakse faili teave selle sisestesse. Inoodi struktuur koosneb 13 väljast, mille jaoks kasutatakse spetsiaalseid tähistusi:

Väli Kirjeldus
devSeadme number failisüsteemis
inoInode number
režiimisFailirežiim (tüüp ja load)
nlinkFailile viivate kõvade linkide arv (linkide puudumisel võrdub 1)
idFaili omaniku numbriline ID
giidFaili omaniku numbrirühma ID
rdevSeadme ID (ainult erifailide jaoks)
suurusFaili suurus baitides
aegaAeg, mil failile viimati juurde pääseti alates ajast
mtimeAeg viimane muudatus faili ajastust
ctimeInoodi muutmise aeg ajastust alates
blksiizeEelistatud ploki suurus I/O toimingute jaoks
plokidFaili mahutamiseks eraldatud plokkide tegelik arv

Kõik failisüsteemid ei toeta kõiki loetletud inode struktuuri välju.

Funktsioon stat() on loodud faili inode struktuuri väljade väärtuste saamiseks. Selle ainsaks parameetriks võib olla kas failinimi või programmis avatud faili käepide. See tagastab loendi 13 elemendist, mis sisaldavad faili sisendstruktuuri väljaväärtusi tabelis loetletud järjekorras.

Tüüpiline kasutusala Perli programm esitatud allpool:

($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksisuurus,$plokid) = stat($failinimi);

Välja väärtuste määramine skalaarmuutujate loendile koos väljanimedele vastavate identifikaatoritega muudab programmi loetavamaks kui skalaaride massiivi määramine:

@inode = stat($failinimi);

Viimasel juhul saate vastava välja väärtuse ainult indeksi abil, mis pole eriti mugav, kuna peate meeles pidama vajaliku struktuurivälja numbrit.

Kui funktsiooni stat() kutsumisel parameetrit ei täpsustata, tagastab see faili inode struktuuri, mille nimi sisaldub erimuutujas $_.

Faili kohta teabe hankimise funktsioon loendikontekstis eduka täitmise korral tagastab faili inode struktuuri väljade väärtuste loendi või tühi nimekiri ebaõnnestumise korral. IN skalaarne kontekst see tagastab tõeväärtuse Tõene või Väär, olenevalt selle täitmise tulemustest.

Faili kohta teabe kasutamise hõlbustamiseks salvestab funktsioon stat() saadud välja väärtused õnnestumise korral vahemällu. Kui kutsute seda funktsiooni spetsiaalse failideskriptoriga _ (alakriips), tagastab see eelmisest kõnest vahemällu salvestatud teabe. See võimaldab teil kontrollida faili erinevaid atribuute ilma funktsiooni stat() uuesti välja kutsumata või selle täitmise tulemusi programmi muutujatesse salvestamata.

Funktsiooni stat() saab kasutada mitte ainult faili, vaid ka sellele viitavate kõvalinkide ja ka kataloogide inode struktuuri saamiseks, kuna need on ka failid, mille andmeplokid sisaldavad kataloogi failide nimesid ja nende numbrilisi inode .

sümbollink

Sümbollink OLD_NAME, NEW_NAME

umask

Määrab protsessi pääsurežiimi maski, mille annab EXPRESSION (oktaalne) ja tagastab juurdepääsurežiimi maski eelmise väärtuse.

Umask VÄLJENDUS

ühenda lahti

Kustutage loendis LIST määratud failid. Tagastab edukalt kustutatud failide arvu.

Tühista LIST linkimine

aega

utime LOEND

Faili inode struktuuris on kolm välja, mis salvestavad failile viimase juurdepääsu aja (atime), selle muutmise (mtime) failis ja inode muutmise (ctime). Funktsiooni utime() saab kasutada failile viimati juurdepääsu ja muutmise aja muutmiseks. Selle parameeter on loend, mis sisaldab töödeldavate failide nimesid, kusjuures loendi kaks esimest elementi on arvväärtusi uus aeg viimane juurdepääs ja modifikatsioonid:

@files = ("fail1.dat", "fail2.dat"); $nüüd = aeg; utime $now, $now, @files;

Selles koodilõigul muudetakse @files loendis olevate failide viimane juurdepääsu- ja muutmisaeg praegune aeg, mis saadakse ajafunktsiooni abil.

Pange tähele, et funktsiooni utime() käivitamisel muudetakse ka inode viimase muutmise aega (ctime) - see määratakse praeguse ajaga võrdseks. Tagastusväärtus on failide arv, mille puhul viimase juurdepääsu ja muutmise aja toiming õnnestus.

Pealeht» PERL » Aasad ja oksad.

Faili sisend ja väljund.

FAILIDE SISEND JA VÄLJUND Perl oli spetsiaalselt loodud selleks, et olla piisav vahend tekstifailide lugemiseks ja kirjutamiseks. Nagu saate hiljem teada, täidab Perl binaarfailidel juhusliku juurdepääsu ja sisend-/väljundfunktsioone. Failitoimingud nõuavad failikäepidet, mis on konkreetsele failile vastav muutuja. Vaikimisi on igal Perli skriptil kolm standardset osutit, mille Perl skripti käivitamisel automaatselt avab: STDJN, STDOUT, STDERR. Need kolm standardset osutit vastavad programmeerimiskeele C standardsetele voogudele STDIN, STDOUT, STDERR Lisaks saab Perli skript avada täiendavaid viiteid teistele kindlatele failidele. FAILIDE JA MUUDE VOOGUDE AVAMINE Et skript saaks faili kasutada, peab see kutsuma avamisfunktsiooni. Tal on järgmine vaade: avatud(FailiHandle[, Failinimi]) Erinevalt funktsioonist avatud raamatukogud Alates C käitusajast ei sisalda Perli avatud funktsioon funktsioonikutses režiimi parameetrit. Perl määrab faili avamise režiimi failinime põhjal. Tabel 12.3 illustreerib seost faili avatud režiimi ja faili nime vahel. Faili nimi Toiming Ava kirjutuskaitstud fail (sarnane fopen-iga) FAIL> Loo kirjutamiseks fail (nagu fopen) >FILE> Ava fail selle lõppu lisamiseks (nagu fopen) FAIL> Loo fail lugemiseks/kirjutamiseks (nagu fopen fopen) ) Ava toru käsku täitvast protsessist Ava toru käsku täitva protsessi juurde Tab. 12.3. Perli failide nimetamise ja juurdepääsu kokkulepped Märkus. Toruvoo režiim ei pruugi kõigis süsteemides eksisteerida. Kui failinimi jäetakse avamiskutsest välja, eeldab Perl, et failinimi sisaldub stringi muutujas $FileHandle. Kui skript on faili kasutamise lõpetanud, sulgeb see selle sulgemisfunktsiooni abil järgmiselt: close(FileHandle); koodilõik illustreerib avamise ja sulgemise funktsioonide kasutamist: open(InFile, "test.dat") || surema; # avatud lugemiseks # test.dat avatud(OutFile, ">test.dat") || surema; # loo test.dat $AuxFile = ">>test.dat"; avatud (Aux, $AuxFile) || surema; # avaneb lõpetamiseks # test.dat close(InFile); sulge(Väljafail); sulgeda (Aux); Pange tähele, et failiosutitel pole tavalisi ühekohalisi eesliiteid. Nagu saate hiljem teada, võivad Perli skriptid salvestada kursori nimesid skalaarmuutujate stringidena ja edastada kursorit mis tahes funktsioonile, mis suudab neid töödelda. Perl teostab väärtuse teisendamise vastavalt vajadusele. Operatsiooniruumis MS-DOS süsteem Perl toetab lisafunktsiooni nimega hinmode, mis võimaldab faili I/O-l teksti- ja binaarrežiimide vahel lülituda. Enamikus süsteemides pole teksti- ja binaarrežiimide eristamine asjakohane. Siiski selleks operatsioonisüsteem MS-DOS reavahetusmärk on kahe märgi jada (CR+LF). Kuna enamik programme ei eelda, et stringi lõpus on kaks märki, peab I/O-süsteem teisenduse tegema. Binmode funktsiooni kasutamiseks saab avada vastava osuti. Funktsiooni binmode vorming on järgmine: binmode(FileHandle); ANDMETE REA LUGEMINE JA KIRJUTAMINE Skripti jaoks on lihtsaim viis failist rea lugemiseks kasutada lauset. Perlis muutub kolmnurksulgudega ümbritsetud failikursor sisendsümboliks (input-symbol). Näiteks järgmine programmifragment illustreerib sisestusmärgi kasutamist faili Test.dat sisu lugemiseks ja kuvamiseks. open(InFile, "Test.dat") || surema; while ($line =) ( print $rida; # Trüki rea failist ) close(InFile); Kui sisestusmärk jõuab faili lõppu, tagastab see false, mis sisse sel juhul lõpetab while-tsükli. Seal on spetsiaalne (tühi) sisestusmärk, tähistatud, millel on väga eriline, kuid kasulik kasutus. Kui skript kasutab esimest korda tühja sisendmärki, analüüsib see argumente käsurida. Kui string @ARGV on tühi, loetakse sisendmärk STDIN-ist. Kui @ARGV on mittetühi, avab Perl esimese @ARGV määratud faili ja loeb faili sisu. Kui Perl lõpetab ühe faili töötlemise, liigub see järgmise juurde. Kui skript on kõik failid läbi lugenud, tagastab sümbol vale. Perli skriptid võivad kasutada ka sisestusmärki, et lugeda kogu faili sisu massiivi, nii et faili iga rida saab massiivi elemendiks. Näiteks järgmine käsk loeb STDIN-failist @lines massiivi: @lines = ; Andmete faili kirjutamine on samuti üsna lihtne. Tegelikult tegite seda iga kord, kui kasutasite printimisfunktsiooni. Prindifunktsiooni täielik vorming on: print List; Kui printimisfunktsioon ei saa argumendina failiosutit, saadab see väljundi STDOUT-i. Järgmine programmi fragment illustreerib printimisfunktsiooni kasutamist andmete lisamiseks väljundfaili: open(LogFile, ">>logfile.dat") || surema; ############### ($m, $d, $y) = (kohalik aeg(aeg)) ; print LogFile "Kapteni logi, Stardate ++m$/$d/$y\n"; close(LogFile); Märkus: failikursorit ja väljundnimekirja ei eraldata komaga. ANDMETE LUGEMIS- JA KIRJUTAMISPLOKID Programmeerijad sageli peetakse tekstifaile tekstivoogudeks lihtsalt seetõttu, et üks märk järgneb teisele kuni faililõpu markerini Kui skript peab töötama failiga, mis on pigem plokile orienteeritud kui vooorienteeritud, võib skript kasutada sysread ja syswrite funktsioonid fikseeritud andmeplokkide töötlemiseks Funktsioonidel sysread ja syswrite on järgmised vormingud: $result = sysread(FileHandle, $Var, Length[, Offset]);$result = syswrite(FileHandle, $Var, Length[, Offset]) Kui funktsioonikutse määrab nihke faili algusest (Offset), siis funktsioonid otsivad kohta, kust nad alustavad I / O. Funktsioonid sysread ja syswrite edastavad andmeid skalaarmuutuja abil stringi tüüp. Kuna funktsioonid käitavad fikseeritud plokid mälus, võivad andmed sisaldada kahendväärtusi, sealhulgas nulle ja faililõpu markereid. Kui funktsioonikutse määrab nihke faili algusest (Offset), siis funktsioon otsib failis kohta, kust hakkab I/O toiminguid tegema. Kui töötate andmeplokkidega, saavad skriptid kasutada ka järgmisi I/O funktsioone: $result = seek(FileHandle, Position, Base); $tulemus = tell(FailiHandle); $tulemus = eof(FileHandle); Otsimisfunktsioon töötab täpselt nagu fseek, C-käivitusaja teegi funktsioon Parameeter Position määrab asukoha lähtekoha suhtes, mis omakorda määratakse parameetriga Base järgmiselt: ? 0 Kas otsida failide algusest? 1 Kas otsida praegusest asukohast? 2 Otsi faili lõpust Perli tell funktsioon töötab täpselt nagu C käitusaja teegi fiktiivne ftell See funktsioon tagastab praeguse asukoha failis, kust lugemis- või kirjutamisoperatsioon sooritatakse. Lõpuks tagastab funktsioon eof, nagu ka funktsioon C feof, väärtuse või, mida skript saab kasutada, et teha kindlaks, kas faili lõpp on saavutatud. BINAARANDMETE TÖÖTLEMINE Kuigi Perl on peamiselt keskendunud tekstitöötlusele, suudab see töödelda ka binaarandmeid. Skriptid saavad stringimuutujate abil teisaldada binaarandmeid tükkidena ja sooritada baitide sisend-/väljundoperatsioone funktsioonide sysread ja syswrite abil. Kuid selleks, et andmetega midagi peale hakata, peab skript andmed teisendama skalaarvormingusse. BINAARANDMETE SALVESTAMINE Kui Perli skript loeb funktsiooni sysread abil binaarandmete plokki, paigutab see need binaarandmed skalaarstringi muutujasse. Perli ei huvita, millised andmed on, kas need sisaldavad nullväärtusi või mitte-ASCII väärtusi. Tähemärgistringis aktsepteerib Perl baite baitidena. Erinevalt C-st ei kasuta Perl null-lõpuga stringe. Kui andmed vastavad ASCII kooditabelile, saab skript neid töödelda nagu mis tahes teksti. Kuid kui andmed on kahendväärtused, peab skript need lahti pakkima, enne kui Perl saab andmeid töödelda. BINAARANDMETE STREETIDE VÄLJAPAKKIMINE PERL-KEELEMUUTUVATEKS Selleks, et skript pääseks juurde binaarandmetele, peab ta need lahti pakkima, suunates selle skalaarvormingusse. Perli skriptid pakivad andmed lahti, kasutades lahtipakkimisfunktsiooni, mille vorming on järgmine: $result = unpack(Mall, Expression); Avaldis on tavaline stringi muutuja, mis sisaldab funktsiooni sysread poolt loetud binaarandmeid, kuid võib olla ka avaldis, mida tuleb tõlgendada stringina. Mall on malli märgistring, mis kirjeldab, kuidas avaldise operandi väärtusi tõlgendada. Järgmine koodilõik illustreerib lahtipakkimise funktsiooni kasutamist: ($r, $g, $b) = unpack("C3", $color);# pakib lahti 3 märgiks @longwords = unpack("L*", $ andmed); # pakib lahti # pika sõna loendisse @stuff = unpack("S2L", $bin); # pakib lahti kaheks lühikeseks ja pikaks püksiks. Igale mustrimärgile võib järgneda number, mis näitab, mitu korda seda märki kasutada. Kui numbri asemel on tärn (*), tehakse toiming kõigi rea ülejäänud andmetega. Kui numbrit ei määrata, tehakse see üks kord. Skript võib panna mallistringi suvalise arvu mallimärke. Tabelis 12.4 on loetletud märgid, mis moodustavad parameetri Malli string, koos kirjeldusega, kuidas iga märk mõjutab lahtipakkimisfunktsiooni täitmist. Malli märk Kirjeldus a ASCII string nullmärk puudub A ASCII string ilma nullmärgita b Bitring (kõige olulisem bitt enne) B Bitring (kõige olulisem bitt enne) c Ühebaidine märgiga märk C Ühebaidine märgita märk d Topelttäpsus ujukoma väärtus f Ujukomaväärtus , ühe täpsusega muster h Kuueteistkümnendväärtuste string (kõigepealt väikseimad numbrid) H Kuueteistkümnendväärtuste jada (suured numbrid enne) i Märgiga täisarv I Märgistamata täisarv l Märgiga pikk tüüp pikk L Sama, kuid märgita n Lühike täisarv N Pikk täisarv p Osuti stringile s Märgiga lühike täisarv S Märgistamata lühike täisarv u Stringi kodeering v Lühike täisarv V Pikk täisarv x Hüppa üks bait edasi X Hüppa üks bait tagasi @ Mine stringi määratud positsioonile Tab. 12.4. Malli sümbolid ANDMETE PAKENDAMINE BINAARSEADMETEKS Binaarandmete väljastamiseks peab skript pakkima skalaarväärtused binaarsetesse märgistringidesse. Selleks kasutatakse paki funktsiooni, mille vorming on toodud allpool: $result = pack(Mall, List); Järgmine programmifragment illustreerib pakkfunktsiooni kasutamist: $color = pack("C3", $r, $g, $b); $andmed = pakk("L*", @pikksõna); $bin = pakk("S2L", @stuff); Pakkimisfunktsioon kasutab samu metamärke kui lahtipakkimisfunktsioon, välja arvatud a-märgid. A, u, x, x, @. TÖÖD kataloogidega Perl pakub failide haldamiseks mitte ainult laia valikut funktsioone, vaid ka mõningaid väga mugavad funktsioonid kataloogide skannimiseks. Järgmistes osades vaatleme üksikasjalikult mõnda kataloogidega töötamise põhifunktsiooni. kataloogide AVAMINE, LUGEMINE JA SULGEAMINE Perli skriptid võimaldavad avada ja lugeda failide sisu. Samamoodi avavad need skriptid katalooge ja loevad neis sisalduvate slaidide nimesid. Kataloogi avamiseks kasutavad skriptid funktsiooni opendir, edastades sellele kataloogikursori ja tee. Kataloogis sisalduvate failide loendi lugemiseks kasutab skript funktsiooni readdir. Lõpuks kasutatakse kataloogi sulgemiseks funktsiooni closedir. Järgmine programmi fragment illustreerib funktsiooni readdir kasutamist aktiivse kataloogi failide loendi kuvamiseks: opendir(Dir, $INC) || surema; while ($fail = readdir(Dir)) ( print "$file \n" ) closedir(Dir); See jupp kasutab $INC vormingut, loendit); $tulemus = sprintf(vorming, loend); Vaikimisi saadab printf-funktsioon vormindatud väljundi STDIO-le ja funktsioon sprintf tagastab vormindatud stringi. Mõlemal juhul on stringivorming peaaegu identne C-funktsioonidega, välja arvatud see, et Perli funktsioonid ei toeta pikkuse määrajat (*). Järgmine programmifragment illustreerib printf ja sprintf funktsioonide kasutamist. $täpsus = 2; $pi = 3,1415; printf("%.2f\n", $pi); # prindib 3.14 printf("%.$(täpsus)f", $pi); # prindib 3.14 VÄLISPROGRAMMIDE KUTSAMINE PERLI SCRIPTIST Olles teatud mõttes asendaja kestaskriptid, Perl toetab süsteemi interaktsiooni, sealhulgas väliste programmide helistamist. Järgmistes jaotistes käsitletakse mitmeid viise väliste programmide helistamiseks perli skriptid. Pidage siiski meeles, et skriptide käivitamise lubamine süsteemi käsud, avate seeläbi oma sõlme turvasüsteemis augud. Järgige üldist mittetegemise reeglit välised käsud Perli skriptist. Kui olete aga sunnitud täitma skriptist väliseid käske, saate selleks kasutada süsteemi, exec või fork sisseehitatud funktsioone. REGULAARVÄLJENDID Kogu selle peatüki jooksul on teile tutvustatud stringide töötlemise näidisfunktsioone. Paljud neist põhinevad regulaaravaldiste kontseptsioonil. Nagu järgmistest osadest näete, kasutavad Perli skriptid laialdaselt regulaaravaldised teksti töötlemiseks. Kui regulaaravaldised on teile uued, ärge muretsege. Lühikese aja jooksul pärast selle peatüki mõne jaotise läbimist on regulaaravaldised hõlpsasti mõistetavad. REGULAARVÄLJENDITE ÜLEVAADE Regulaaravaldised on väljamõeldud termin, mis sai alguse arvutiteadus ja kasutatakse sümbolitest koosneva mustri tähistamiseks. Perli skriptid kasutavad märgimustreid lihtsalt sisendi sõelumiseks, jagades selle tükkideks. Sageli saab skript parsida sisendit tühikute, komade, tabeldusmärkide ja muude eraldajate põhjal. Kuid kui sisendandmed on suvalises vormingus, on regulaaravaldised selleks parim viis. REGULAARAvaldise SÜNTAKS Regulaaravaldiste suuruse vähendamiseks kasutab Perl erimärke. Tabelis 12.6 on loetletud mõned märgid, mida Perli skriptid regulaaravaldistes kasutavad. Sümbolite kirjeldus. Sobib mis tahes märgile (v.a reavahetus) (..) Rühmitab elementide jada + sobib eelmise mustriga või suur kogus üks kord? Vastab mustriga null või üks kord * Sobib mustriga üks või null korda [...] Sobib antud komplekti märgiga [^...] Sobib märgiga eitatavas hulgas (...|...|. ..) Vastab ühele alternatiividest ^ Sobib stringi algusele $ Sobib stringi lõpus oleva mustriga (n, m) Sobitab mustri n kuni m korda (n) Sobib mustriga täpselt n korda (n,) Ühildub mustriga vähemalt n korda \n\t jne. Vastab reavahetusele, tabeldusjoonele jne. \b Sobib sõnapiiril \B Sobib sõnapiiril \d Sobib numbrile \D Sobib mittekohalisele numbrile \s Sobib tühikule \S Sobib mittetühikule \w Sobib tähe või number \W Vastab märgile, mis ei ole täht ega number. 12.6. Regulaaravaldistes kasutatavad märgid Perl paneb regulaaravaldised (mustrid, mustrid) kaldkriipsudesse ehk kaldkriipsudesse, näiteks kujul /muster/. Järgmine koodifragment illustreerib Perli regulaaravaldisi: # järgmised regulaaravaldised on tõesed, kui: /ig/ # string sisaldab "ig" /(b|d|f)ig/ # string sisaldab "big", "dig" või "fig" " /+/ # string sisaldab numbrit /*/ # string sisaldab identifikaatorit Kui need väljendid pole teie jaoks mõttekad, ärge muretsege. Selles peatükis vaatleme mõnda regulaaravaldist. Praegu pidage meeles, et Perl paigutab regulaaravaldised kahe kaldkriipsu vahele, nagu ülal näidatud. REGULAARVÄLJENDITE KASUTAMINE MÄRKSÕNADE OTSIMISEKS Perli skriptid kasutavad regulaaravaldisi, et lihtsustada stringide võrdlemist. Kontrollimaks, kas string sisaldab antud mustrit, saab skript kasutada selliseid regulaaravaldisi nagu: if ($str =~ /muster/) Sel juhul hindavad regulaaravaldised, kas muster leidub stringis ($str) . Kui string by sisaldab mustrit, tagastab avaldis väärtuse. Näiteks testib järgmine avaldis, kas string sisaldab teksti Web Programming: if ($str =~ /Web Programming/) Täpse vaste testimiseks peab avaldis ankurdama võrdluse stringi algusesse ja lõppu. Näiteks järgmine avaldis hindab suurust siis ja ainult siis, kui muutuja $str võtab ühe kolmest väärtusest: ,) : ($str =~ /^ba(na) (2,4)$/) Samamoodi on järgmine avaldis tõene siis ja ainult siis, kui muutuja $str sisaldab sõna ja ei ole osa teisest sõnast, nt. ($str =~ /\bthe\b/) REGULAARVÄLJENDITE KASUTAMINE SISENDI ANALÜÜSIMISEKS Kuna teie Perli skriptid muutuvad keerukamaks, tekib palju juhtumeid, kui soovite teada rohkem kui lihtsalt kontrollida, kas muster vastab stringile või mitte. Näiteks võite soovida, et skript tooks konkreetse stringi väärtuse. Kasutades regulaaravaldises rühmitusmärke () saab skript stringist välja võtta sobivad väärtused ja moodustada neist loendi. Näiteks järgmine koodilõik kasutab loendist kuude, päevade ja aastate eraldamiseks regulaaravaldisi: $str = " 1. jaanuar 1997, "; ($m, $d, $y) = $str =~ /\s*(\S*)\s + (\d+)\D + (\d(4))/; Sel juhul saate lugeda selliseid regulaaravaldisi: ? Jätke kõigepealt ükskõik milline vahele eriline tegelane; ? kirjutada kõik mitteerimärgid muutujasse $m (muutuja kuude kaupa); ? jäta vahele erimärk; ? pane kõik numbrid muutujasse $d (muutuja päevade salvestamiseks); ? jäta vahele kõik märgid, mis ei ole numbrid; ? pane muutujasse $y (aastate muutuja) neli numbrit. Perl toetab ka teist mustrite sobitamise vormi, kasutades operaatorit (=~), mis lisab tulemuse eituse: (!~). See operaator on samaväärne avaldisega!($str =~/muster/). REGULAARVÄLENDID STREETIDE OTSIMISEKS JA ASENDAMISEKS Siiani olete kasutanud mustri sobitamise tehteid. Selgub, et Perl toetab kahte teist regulaaravaldist, mis muudavad testitavat stringimuutujat. Järgmises lauses asendab Perl stringi selle osa, mis mustriga sobib antud string: $str =~ s/muster/asendamine/; Näiteks järgmine lause asendaks sõna järgmisega: $str =~ s/\bcolor\b/color/; Väike muudatus võimaldab asendada kõik sõnad järgmisega: $str =~ s/\bcolor\b/color/g; Sel juhul käsib avaldise lõpus olev g Perlil kasutada globaalset asendust. I-liidet kasutades saate määrata, et otsing on tõstutundlik. Erinevalt lihtsast mustrite vastest teostab asendust ka järgmine avaldis: $str =~ tr/SearchList/ReplacementList/; Näiteks kõigi väiketähtede asendamine samade tähemärkidega suurtähtedega saab teha järgmiselt: $str =~ tr/a-z/A-Z/; # muudab suur- ja väiketähti alumiselt ülemiseks Vaatleme enda jaoks järgmist näidet: $leters = "abcde"; print "$leters\n" # Trükib abcde $leters =~ tr/a-z/A-Z/; print "$letters\n" # Trüki ABCDE KOKKUVÕTE See peatükk tutvustab Perli programmeerimist. Siin käsitletud mõisteid kasutades saate kirjutada keerukaid CGI skriptid Perlis. Järgmine peatükk aitab teil omandada oskusi luua Perl CGI skripte, mida saab käivitada oma server. Enne jätkamist veenduge, et mõistate järgmisi põhimõisteid: ? Perl on tõlgendatud programmeerimiskeel, mida programmeerijad kasutavad veebi ja Interneti jaoks skriptide kirjutamiseks. ? Perli keelekonstruktsioonid on paljudes aspektides sarnased nende vastetega C-s, kuid Perl pakub palju lisavõimalusi, eriti C-s raskesti leitavate stringide ja failide käsitlemiseks. Perl on peamine keel CGI-programmide kirjutamiseks veebi ja Interneti jaoks, seda peamiselt tänu oma paindlikkusele, kompaktsele stiilile ja kõrgele turvalisusele. PERLi KOHTA TEABE VÕTMISED VEEBISAIDID eriline teave Perl 5 keeleressursside ja raamatukogude kohta. Kasutage neid veebisaite otsingu lähtepunktina. http://www.shareware.com/top/Source-Code-table.html – SHAREWARE.COM – kõige rohkem populaarsed failid programmikoodidega. http://www.inxpress.net:80/~moewes/computer/perl95.html – Perl Windows 95 jaoks. http://www.mit.edu:8001/perl/perlapi.html – PERLAPI http://www .genome.wi.mit.edu:80/ftp/pub/software/WWW/cgi_docs.html – CGI.pm – Perl5.CGI raamatukogu http://www.metronet.com/0/perlinfo/perl5/manual/perl .html – PERL http://www.teleport.com/~rootbeer/perl.html – Lingid Perli õppijatele

Perl kasutab failitüübiga töötamiseks tehnikat, mida nimetatakse muutuva faili deskriptoriks.

Andmete lugemine või kirjutamine failist nõuab failideskriptorite kasutamist.

Failikäepide (faili deskriptor) on I/O ühenduste nimi.

Perl pakub kolme käepidemefaili: STDIN, STDOUT, STDERR, mis esindavad standardsisendit, standardväljund ja standardvea väljund.

Perli faile saab avada järgmistel viisidel:

Ava FILEHANDLE, EXPR ava FILEHANDLE sysopen FILEHANDLE, FILEHANDLE, FILEHANDLE, MODE, PERMS sysopen FILEHANDLE, FILENAME, MODE

Parameetri kirjeldus:

  • EXPR: faili nimi ja faili juurdepääsu tüüp, mis koosneb avaldisest.
  • MODE: juurdepääs failitüübile.
  • Viivitamine: juurdepääsubitt (lubade bitid).

avatud funktsioon

Kirjutuskaitstud režiimi avamiseks kasutame järgmist koodifunktsiooni (<), чтобы открыть файл file.txt:

Open(ANDMED, "

<Только для lugemist esitus.

Failikoodi andmekäepidet kasutatakse faili lugemiseks, järgmine näide avab faili ja väljastab faili sisu:

#!/usr/bin/perl open(DATA, " )( prindi "$_";)

Järgmine kood on mõeldud faili file.txt avamise viisi kirjutamiseks (>):

Ava(DATA, ">fail.txt") või sulge "fail.txt 文件无法打开, $!";

> Salvestusrežiimi jaoks.

Kui peate faili avama lugemis- ja kirjutamisrežiimis, enne > või<символ знак +, чтобы добавить:

Open(ANDMED, "+

See lähenemisviis ei eemalda algse faili sisu, kui soovite eemaldada järgmise vormingu:

Avage DATA, "+>file.txt" või sulgege "file.txt 文件无法打开, $!";

Kui soovite esitada täiendavaid andmeid, lisaandmeid enne, peate faili avama ainult lisamisrežiimis:

Ava(DATA,">>

>> Esindab andmete lisamist olemasolevale failile, kui peate faili sisu lugema, lisamiseks + märgi lisamiseks:

Open(ANDMED,"+>>fail.txt") || die "fail.txt 文件无法打开, $!";

Järgmises tabelis on loetletud erinevad režiimid juurdepääs:

režiimiskirjeldus
<Или г
> või
>> VõiAvage failikursori kirjutamiseks faili lõppu. Kui faili pole olemas, üritatakse see luua.
+ <Или г +
+> Või w +Avatud lugemiseks ja kirjutamiseks, failikursor asub faili päises ja faili suurus on kärbitud nulliks. Kui faili pole olemas, üritatakse see luua.
>> + Või +Avatud lugemiseks ja faili lõpus oleva kursori kirjutamiseks. Kui faili pole olemas, üritatakse see luua.

SysOpen funktsioon

Funktsioon SysOpen sarnaneb avatud funktsiooniga, kuid need pole samad argumendivormid.

Järgmine näide põhineb lugemisel ja kirjutamisel (+<имя файла) способ, чтобы открыть файл:

Sysopen(ANDMED, "fail.txt", O_RDWR);

Kui teil on vaja värskendada kustutatud faile enne faili kirjutamist järgmiselt:

Sysopen(ANDMED, "fail.txt", O_RDWR|O_TRUNC);

Saate kasutada O_CREAT-i uue faili loomiseks, O_WRONLY-kirjutusrežiimi, O_RDONLY-kirjutusrežiimi.

Suvandid curl oktaalne atribuudi väärtus näitab, et faili õigused pärast loomist vaikimisi 0x666.

Järgmises tabelis on loetletud võimalikud režiimi väärtused.

režiimiskirjeldus
O_RDWRAvatud lugemiseks ja kirjutamiseks, failikursor faili päises.
O_RDONLYAvage faili päises kirjutuskaitstud failikursor.
O_VALEAvatakse failikursori kirjutamiseks faili päisesse ja faili suurus kärbitakse nulliks. Kui faili pole olemas, üritatakse see luua.
O_LOOLooge fail
O_APPENDLisa fail
O_TRUNCFaili suurus on nullitud
O_EXCLKui kasutate funktsiooni O_CREAT, fail on olemas, tagastab see veateate, saab kontrollida, kas fail on olemas
O_NONBLOCKMitteblokeerivad I/O toimingud, nii et me kas õnnestume või tagastame kohe vea ilma blokeerimata.

sulgemisfunktsioon

Pärast faili kasutamist sulgege fail, mida soovite värskendada, faili sulgemisega seotud sisend- ja väljundfaili deskriptori puhvrid, millel on järgmine süntaks:

FILEHANDLE sule

FILEHANDLE määratud failikäepideme puhul tagastab eduka sulgemise korral tõene.

Sule(ANDMED) || die "无法关闭文件";

Failide lugemine ja kirjutamine

Teabe lugemine ja faili kirjutamine On mitmeid viise:

operaator

Peamine meetod teabe lugemiseks avatud failideskriptorist on operaator. Skalaarses kontekstis tagastab see failideskriptorist ühe stringi. Näiteks:

#!/usr/bin/perl print "本教程网址?\n"; $nimi = ; print "网址:$nimi\n";

Pärast ülaltoodud protseduuri rakendamist sisestame järgmise teabe prindiavalduse väljundi URL-i:

Kui kasutame lause, mis tagastab loendi iga rea ​​jaoks failikirjelduse, näiteks saame kõik read massiivi importida.

Rakendus loob faili import.txt järgmiselt.

$ cat import.txt 1 2 3

#!/usr/bin/perl open(DATA," ; print@read; # 输出数组内容 close(DATA);

ECFS funktsioon

Funktsioon xgetc tagastab ühe märgi määratud FILEHANDLE'ist, kui te ei määra vastupidist STDIN-i:

Getc FILEHANDLE getc

Kui ilmneb tõrge või faili deskriptor on faili lõpus, tagastab see UNDEF-i.

lugemise funktsioon

Lugemisfunktsiooni kasutatakse failipuhvrist loetud teabe töötlemiseks.

Seda funktsiooni kasutatakse failist binaarandmete lugemiseks.

Loe FILEHANDLE, SCALAR, LENGTH, OFFSET loe FILEHANDLE, SCALAR, LENGTH

Parameetri kirjeldus:

  • FILEHANDLE: failikäepidemed, mida kasutatakse faili kordumatu identifikaatori salvestamiseks.
  • SKALAAR: alusta lugemisasendit.
  • Pikkus: loetava sisu pikkus.
  • OFFSET: nihe.

Lugetud baitide arvu lugemise edukal naasmisel tagastab UNDEF-i tõrke korral faili lõpus 0.

printimisfunktsioon

Kogu teabe jaoks, mida loetakse failideskriptori funktsioonidest, on põhifunktsiooni tagaküljel trükitud kirjutamine:

Prindi FILEHANDLE LIST print LIST print

Faili- ja printimisfunktsioonide kasutamine võib väljundseadmetesse töödelda (STDOUT: standardväljund), näiteks:

Prindi "Tere maailm!\n";

failide kopeerimine

Järgmises näites avame olemasoleva faili file1.txt ja loeme seda iga rida, mis on kirjutatud failis file2.txt:

#!/usr/bin/perl # 只读方式打开文件 open(DATA1, " file2.txt"); # 拷贝数据 while( ) ( print DATA2 $_; ) close(DATA1); sulge(ANDMED2);

Nimeta fail ümber

Allpool on näited, me nimetame juba olemasoleva faili file1.txt ümber failiks file2.txt, kataloogis / usr / w3big / test / in:

#!/usr/bin/perl ümbernimetamine ("/usr/w3big/test/file1.txt", "/usr/w3big/test/file2.txt");

Funktsioon rename võtab ainult kaks parameetrit, ümbernimetatakse ainult juba olemasolev fail.

Kustuta failid

Järgmised näited näitavad, kuidas me funktsiooni kasutame UNLINK selle faili eemaldamiseks:

#!/usr/bin/perl unlink("/usr/w3big/test/file1.txt");

Määrake faili asukoht

Saate kasutada funktsiooni ÜTLE, et saada faili asukoht ja määrata ka asukoht failis, kasutades funktsiooni otsing:

ütle funktsioon

Funktsiooni tell kasutatakse faili asukoha leidmiseks:

Öelge FILEHANDLE'ile

Kui FILEHANDLE, tagastab funktsioon failikäepideme asukoha baitides. Kui te ei määra, valitakse vaikeväärtuse naasmine faili käepidemega.

otsige funktsiooni

Funktsiooni lookup() kasutatakse failideskriptoris navigeerimiseks, et lugeda ja kirjutada failideskriptori teeviiteid faili lugemiseks või kirjutamiseks lugemis- ja kirjutamisbaitides:

Otsige FILEHANDLE, POSITION, WHNCE

Parameetri kirjeldus:

  • FILEHANDLE: failikäepidemed, mida kasutatakse faili kordumatu identifikaatori salvestamiseks.
  • POSITION: määrab failideskriptori (kirjutus-lugemispositsiooni osuti) teisaldatavate baitide arvu.
  • FROM: on faili deskriptor (kohanäitajate lugemiseks ja kirjutamiseks) algab lähtepositsioonist, võite võtta väärtuse 0, 1; tähistavad faili algust, praegust asukohta ja faili lõppu.

Otsi ANDMED, 256, 0;

faili teave

Perli failitoimingud võivad kontrollida ka faili olemasolu ning lugeda ja kirjutada.

Et saan luua faili file1.txt järgmiselt:

$ cat file1.txt www..txt"; minu (@ kirjeldus, $ suurus); if (-e $ fail) ( push @description, "是一个二进制文件" if (-B _); push @description, "是一个socket(套接字)" kui (-S _); push @description, "是一个文本文件", kui (-T _); push @description, "是一个特殊坶)文-b 特殊坶"文; push @description, "是一个特殊字符文件", kui (-c _); push @description, "是一个目录", kui (-d _); push @description, "文件存在_" kui (-x _); push @description, (($size = -s _)) ? "$size 字节" : "空"; print "$file 信息:", join(", ",@description),"\n"; )

Ülaltoodud programmi väljund on:

File1.txt 信息:是一个文本文件, 15

Esitage testlaused järgmises tabelis:

operaatoridkirjeldus
-AFaili esmase juurdepääsu aeg (ühik: päeva)
-BKas see on binaarne
- KOOSFaili (indeksi) inode muutmise aeg (ühik: päeva)
-MViimati muudetud ajafail (ühik: päeva)
- KOHTAKõik failid on tõelised UID-id
-RFaili või kataloogi saab lugeda päris UID/GID abil
-SPistikupesa
-TKas see on tekstifail
-WFaili või kataloogi saab kirjutada päris UID-sse/GID-sse
-XFaile või katalooge saab teha päris UID/GID-ga
-bSpetsiaalne failiplokk (spetsiaalne plokk) (nt kettakinnitus)
- KoosMärgi-eri (erimärkide) fail (nt I/O-seadmed)
-dkataloog
-eFaili või kataloogi nimi on olemas
-ftavaline fail
-gFailil või kataloogil on atribuut setgid
-kFailil või kataloogil on kleepuv osa
-lSee on sümboolne link
-OKõik failid on saadaval UID
-lkFail on nimega toru (FIFO)
-rFaile saab tõhusalt UID/GID lugeda
-sFail või kataloog on olemas ja see ei ole 0 (tagastab baitide arvu)
-tKäsitsege TTY-faili (süsteemi isatty funktsioon () tagastab tulemuse, failinimi ei saa seda testi kasutada)
-uFailil või kataloogil on atribuut setuid
-wFaile saab kirjutada kehtivale UID-le/GID-ile
-xUID/GID abil saab faile tõhusalt käivitada
-zFail on olemas, suurus 0 (kataloogikonstant väär), st kas fail on tühi,

Loodan, et pole vaja kirjutada sellest, mis fail on, kuid arvan, et peate mõtlema, mida saate nendega teha, nagu näete artikli pealkirjast Perlis. Noh, alustame...

Selles artiklis käsitleme:

  • Failidega manipuleerimine
  • Ridadega töötamine failis

    Mis on failimanipulaatorid ja millega nad söövad

    Juurdepääs failidele toimub failimanipulaatorite abil, mis on nii-öelda faili sünonüümid. Need ei ole muutujad ja seetõttu ei saa neid otse teistele muutujatele omistada ega funktsioonidesse üle kanda (selleks peate, nagu öeldakse, minema teist teed).

    Samuti on olemas standardsed Perli failimanipulaatorid. Neid nimetatakse STDIN (standardsisend), STDOUT (standardväljund) ja STDERR (standardne veavoog). Näiteks edastatakse parameetrid skriptile vormilt STDIN-i kaudu (eeldusel, et kasutatakse POST-meetodit).

    Kui on vaja luua failikäepideme koopia (mitte failist, vaid ainult käepidemest, mille kaudu failile ligi pääsetakse), siis saab kasutada avamisfunktsiooni (sellest räägime lähemalt hiljem).

    Näide: open(FILL,"fail.txt"); avatud (FAIL,"<&FILL");

    Failikäepidemete määramise kohta muutujatele:

    $käepide=*TÄIDA; või edasta see funktsioonile: some_sub(*FILL);

    Lõpuks kasutatakse Perli failikäepidemeid enamaks kui lihtsalt faili endaga tegelemiseks. Neid võib seostada mõne protsessi, pistikupesaga vms. Kuid see ei kuulu artikli ulatusse.

    Failidega manipuleerimine

    Fail avatakse avamisfunktsiooni abil.

    Ava(FFF,"> fail.txt");

    Selgitame välja. Funktsioonil on kolm parameetrit: FFF - failikäepideme nimi (seate selle ise), juurdepääsurežiim ">" ja "file.txt" - vajaliku faili nimi. Seal on kolm peamist režiimi: ">" - salvestamine,"<"- чтение, ">>" - faili lisamine.

    Samuti on olemas sysopen funktsioon. Sellega töötamine pole palju keerulisem kui avatud, kuid selle abil saate süsteemile üksikasjalikumalt "rääkida" oma kavatsustest (st mida soovite failiga teha).

    sysopenil on kolm nõutavad parameetrid ja üks valikuline.

    Näiteks: sysopen(FH,$nimi, $lipud, $param);

    FH - tegelikult failimanipulaator, $nimi - faili nimi puhtal kujul(ilma ">" jne). $lipudesse paneme arvu, mis saadakse allpool kirjeldatud konstantide kombineerimisel VÕI (|) kaudu:

    Seda muidugi ei ole täielik nimekiri, kuid siin on kõige vajalikumad ja sagedamini kasutatavad konstandid.

    Ja lõpuks $param. See parameeter määrab faili juurdepääsumaski ja sellele kirjutatakse kaheksandsüsteem. Tavaline väärtus on 0666 (vaikeväärtus, st kui $param on välja jäetud) või 0777. Esimest väärtust kasutatakse tavafailide jaoks, teist väärtust kataloogide ja käivitatavate failide jaoks.

    Näide faili kirjutamiseks avamisest (kui seda ei leita, luuakse see):

    Sysopen(FH,"andmed.txt",O_WRONLY|O_TRUNC|O_CREATE);

    Faili kirjutame printimisfunktsiooni abil.

    Print(FFF "oppa! Faili kirjutamine!");

    Siin on FFF failikäepideme nimi ja tsiteeritud string on tekst, mille tahame kirjutada FFF-ga seotud faili.

    Kui faili enne avamiskatset ei eksisteerinud, loob selle avamise funktsioon ja kui fail oli olemas ja see ei olnud tühi, siis pärast ülaltoodud printimisfunktsiooni ei jää eelmisest teabest midagi alles ja jama mis ma sinna sisse kirjutasin .

    Nagu juba mainitud, on olemas kolm standardset failikäepidet ja kui failikäepide on välja jäetud, väljastatakse printimisfunktsioon STDOUT (sama kehtib ka printf funktsioonid ja kirjutage). Väljundi suuna muutmiseks pakub Perl valikufunktsiooni (kuigi mitte ainult selleks). Näide:

    Open(F1,"> üks.txt"); print "Fail on avatud! Kirjutamine STDOUT-i."; $vana_punkt=select(F1); print "Kirjuta faili üks.txt"; select($vana_punkt); print "Kirjutage uuesti STDOUT-i."; sulge (F1);

    Suleme faili sulgemisfunktsiooniga.

    Sulge (FFF);

    Enda tagant koristamise põhimõte on igaühele lapsepõlvest peale sisendatud. Ärgem unustagem seda programmeerimisel, kuigi väljudes protsessist, mille käigus antud fail, suletakse fail automaatselt.

    Faili lukk

    Esiteks, milleks? Ja selle eest, et kui mitu protsessi tahavad korraga ligipääsu failile, pealegi kirjutamiseks, ja sinna ka midagi kirjutada (painaja), siis kujutage ette, mis juhtuks, kui mitte see imeline lukustusmehhanism. See võimaldab jämedalt öeldes protsesse järjekorda panna. Teeme seda:

    Open(FIL,"> fail.dat"); kari(FIL,2); sulge (FIL);

    Avamise ja sulgemise funktsioonidest oleme juba rääkinud, kuid peatume karjal veidi üksikasjalikumalt. See saab kaks parameetrit - failikäepide ja piltlikult öeldes lukukategooria.

  • 1 jagatud lukk (lugemiseks)
  • 2 eksklusiivset lukku (kirjutamiseks)
  • 4 asünkroonse lukustuse taotlust
  • 8 avamine

    Avamise kohta: lukk vabastatakse automaatselt, kui praeguse skripti poolt kutsutud protsess lõpeb või kui lukustatud failile "manutatud" failipide suletakse. Kui vabastate luku käsitsi, olge ettevaatlik – annate teisele protsessile võimaluse teha mida iganes ta soovib (HOIATUS!) Failiga, mida te pole sulgenud! Tagajärjed võivad olla pehmelt öeldes ebameeldivad, kuid jämedalt öeldes - ettearvamatud (teie jaoks ettearvamatud).

    Ridadega töötamine failis

    Kuna just need failid, mis sisaldavad stringiteavet, pakuvad inimesele kõige rohkem huvi, siis räägime nüüd neist.

    Faili ridade lugemiseks kasutage failikäepidet "tarnitud".<>.

    Näiteks:

    Open(FIL,"data.txt"); samas( ) ( # tee midagi faili iga reaga )

    Kui pole teisiti määratud, kasutatakse sellises tsüklis standardmuutujat "$_" ja rea ​​number kirjutatakse "$.". Kuna rea ​​lõppu tähistab erimärk, näiteks "\n", siis rea enda saamiseks (ilma sellise "sabata") peate selle kärpima funktsiooniga chomp.

    Open(FIL,"data.txt"); samas( ) ( chomp; # lõikab muutujast $_ print erimärgi välja; # kirjuta $_ olekusse STDOUT )

    @strings= ; foreach $rida (@strings) ( print $list; )

    Failis navigeerimiseks kasutatakse funktsioone tell and seek.

    Open(FIL,"data.txt"); $positsioon=teel(FIL); print "Praegune asukoht failis $positsioon. \n"; seek(FIL,$positsioon+10,1); print "Ja nüüd liigutatud praegusest positsioonist 10 baiti faili lõppu. \n"; $positsioon=teel(FIL); print "Nüüd on praegune asukoht failis $positsioon. \n";

    Tulemus:

    Praegune asukoht failis on 0. Ja nüüd oleme liikunud 10 baiti faili lõppu. Nüüd on faili praegune asukoht 10.

    Tellimisfunktsioon võtab parameetrina failikäepideme ja otsingufunktsioon kolm parameetrit. Esimene on failikäepide, teine ​​on baitide nihe ja kolmas suunanihe. Nihkesuundi on kolm: 0 - faili algusest, 1 - praegusest asukohast, 2 - faili lõpust.

    See ei tähenda, et see on kõik, mida Perl meile failidega töötamiseks pakub. Loodetavasti on mul aega kirjutada kataloogidega töötamise viisidest, töö peensustest binaarfailid, objektorienteeritud lähenemine failide ja nende sisu haldamisele.

  • Perl pakub faili lugemis-/kirjutustoimingute tegemiseks kahte funktsioonide komplekti. Ühe komplekti funktsioonid kasutavad puhvrit - teatud mäluala - faili loetud / kirjutatud teabe kogumiseks, pärast selle täitmist või faili sulgemist kirjutatakse puhvri andmed füüsiliselt kettale või saadetakse programmi. Need funktsioonid, sealhulgas print, readline,<>, read , getc , seek ja tell on sisuliselt liidese funktsioonid C ​​stdio puhverdatud I/O teegi rutiinidele. Puhverdatud I/O kasutamine kiirendab andmete lugemist/kirjutamist failidesse. Teise komplekti funktsioonid, mille hulka kuuluvad sysread, syswrite ja sysseek, viitavad otseselt operatsioonisüsteemi I/O funktsioonidele, sooritades otseseid füüsilisi andmete lugemis-/kirjutusoperatsioone ilma neid vahepealsesse puhvrisse kogumata. Faili saab avada juurdepääsuks nii puhverdatud kui ka puhverdamata funktsioonidega mis tahes kahest funktsioonist - avatud () või sysopen () - faili avamisel ei ole reguleeritud, milline funktsioonide komplekt peaks selles sisalduvat teavet töötlema . Ainus nõue on see, et neid kahte lähenemisviisi ei soovitata segada sama faili jaoks samas avatud seansis, kuna see võib viia ettearvamatuteni.

    TÄHELEPANU Sama failiga töötades ärge segage puhverdatud ja puhverdamata I/O funktsioonikutseid. Sarnane praktika võib põhjustada ettearvamatuid kokkupõrkeid. Kui soovite näiteks kasutada puhverdamata lugemise/kirjutamise funktsioone ja puhverdatud o operatsiooniga on failist info juba loetud, siis tuleks fail sulgeda, uuesti avada ja sellega töötamiseks kasutada puhverdamata funktsioone.

    Puhverdatud sisend/väljund

    Kõige sagedamini töötleb programm tekstifaile. Operatsioon<>, mille operandiks on faili deskriptor, loeb failist infot tervete "kirjetena", mis tavaliselt esindavad tekstifaili ridu. Skalaarses kontekstis rakendades loeb see praeguse failikirje, suurendades erimuutujat $., mis jälgib loetud kirjete arvu. Loendi kontekstis loeb sama toiming kõiki faili kirjeid, kui see on esimene, mis selles failis tehti, või ülejäänud kirjeid, kui failist on enne seda tehtud muid lugemisi, ja tagastab loendi, mille elemendid on faili loetud rekordid. Täpsemalt operatsioonist<>loendikontekstis loeb faili ülejäänud kirjeid, alustades selle praegusest asukohast, mida kaudselt muudetakse iga lugemisoperatsiooniga ja mida saab eksplitsiitselt muuta seek () funktsiooni abil, mida saame veidi hiljem tundma õppida. Tulevikku vaadates oletame, et kõigil Perli failidel pole struktuuri, vaid need on nagu C-s kujutatud baitide voona. Kirje eraldaja salvestatakse erimuutujas $/ ja vaikimisi on see reavahetusmärk \n. Seega, kui kasutaja ei määranud oma kirje eraldajat, siis toimingu failikirje alla<>tähendab tekstifaili rida. Erineva kirje eraldaja seadistamine toimub tavapärase toiminguga, millega määratakse muutujale $/ uus märk või kirje eraldaja märkide jada. Loendis 6.9 on toodud mõned nipid failist koos operatsiooniga lugemiseks<>. Nimekiri 6.9. Failist lugemine operatsiooni teel<>#! perl -w avatud (F1, "in.dat") või die "Viga faili avamisel: $!"; open(F2, "out.dat") or die "Viga faili avamisel: $!"; $rida1 = ; # Faili esimene sisestus in.dat $line2 = ; # Teine failikirje in.dat @rest = ; # Faili in.flat ülejäänud kirjed $/ = ">"; # Määrake erinev kirje eraldaja @f2 = ; # Printige faili out.dat lugemiskirjed for($i=0; $i<=$#f2; $i++) { print "Запись ".($i+1).": $f2[$i]\n"; } $/ = "\n"; # Восстановление разделителя по умолчании close (Fl) or die $!; close(F2) or die $!; open(F3, "out.dat") or die "Ошибка открытия файла: $!"; print ; # Trüki kogu fail close(F3) või die $!; Mõned kommentaarid programmi kohta loendis 6.9. Faili in.dat esimene ja teine ​​rida loetakse vastavalt muutujateks $line1 ja $line2, kuna kasutatakse vaikekirje eraldajat \n. Massiivi @rest elemendid salvestavad ridu sama faili kolmandast kuni viimaseni, alates lugemistoimingust määramislauses täidetakse loendi kontekstis. Enne faili out.dat kirjete lugemist seatakse uus kirje eraldaja - sümbol >. Kui fail out.dat sisaldab näiteks ainult ühte rida Ivanov> Petrov> Sidorov> End, siis sisaldavad @f2 massiivi elemendid järgmised väärtused: $f2 = "Ivanov>" $f2[l] = "Petrov>" $f2 = "Sidorov>" $f2 = "Lõpp"
    MÄRKUS Faili out.dat loomisel, kui selle ainus rida lõpeb reavahetusega (vajutatakse Sisestage võti), siis sisaldab $f2 stringi "End\n".
    Nimekirja 6.9 viimases trükilauses toiming käivitatakse loendi kontekstis, kuna funktsioon print() on loendi toiming ja nõuab väärtuste loendit. Kui aga sooviksime printimisel iga kirje eessõnaks lisada teksti, siis eeldame, et kasutame selleks järgmist lauset: print "Record:". ; siis saaksime väljatrüki ainult faili esimesest reast, kuna antud juhul toiming teostatakse skalaarses kontekstis, operatsiooniga loodud stringide liitmine (.). Soovitud tulemuse saavutamiseks tuleks kasutada samas silmus: samas( ) ( print "Entry: ".$_; # Trüki seotud # faili deskriptori järgmine rida F3 ) Tuletage meelde, et kui toimingu tulemus<>ei ole määratud ühelegi muutujale, siis salvestatakse selle täitmise tulemus erimuutujasse S_. Tegelikult lugemiskirjete toimimine<>Perlis rakendab seda sisseehitatud funktsioon readline(), mida saab ka otse välja kutsuda. Selle ainus parameeter on viide faili deskriptorile ja kuna see deskriptor ei kuulu ühegi kehtiva andmetüübi alla (skalaar, skalaaride massiiv või räsi massiiv), peaksite kasutama viidet spetsiaalsele sisemine tüüp Perl typeglob andmed. Selleks lisa lihtsalt faili deskriptori ette *: readline *DESCRIPTOR; Näiteks kaks järgmist väidet on täiesti samaväärsed: $line = ; $rida = readline *STDIN; Loomulikult kehtib kõik, mis öeldi $/ erimuutujas salvestatud kirje eraldajate kohta, ka readline() operatsiooni kohta. Kirjutamis- või lisamisrežiimis avatud faili kirjutab print() funktsioon, mille esimene parameeter on faili deskriptor: print DECRIPTOR OUTLIST; See toiming kirjutab loendi elementide sisu funktsioonikutses määratletud järjekorras ega lisa loendi lõppu ühtegi kirje eraldajat ega reavahetusmärki. Programmeerija peab selle eest ise hoolitsema, lisades väljundloendi lõppu selgesõnaliselt kirje eraldaja või reavahetuse või kasutades selleks spetsiaalse muutuja $\ pakutavat võimalust. Printimisfunktsioon lisab selle erimuutuja sisu oma väljundloendi lõppu, mis vaikimisi sisaldab tühja stringi: # Explicit record separator print F1 @recl1, "\n"; $\ = "\n"; # Kirje eraldaja määramine # Nüüd trükitakse kirje eraldaja kaudselt # iga järgmise funktsiooniga print print F1 @resl2;
    HOIATUS Faili deskriptori ja väljundloendi esimese elemendi vahel ei tohi olla koma. Kui see juhtub, annab perli tõlk välja veateate: Filehandle järel koma pole lubatud.
    Funktsiooni print() abil faili teabe kirjutamisel saate kasutada veel üht kasulikku funktsiooni. Kui erimuutuja $ väärtus on määratud, siis sisestatakse see väljundloendi elementide vahele. Näiteks kui tahame, et loendiüksuste väärtusi ei kuvataks mitte pideva märgivoona, vaid tühikuga eraldatuna, siis peaksime selle erimuutuja väärtuseks määrama tühiku: $var1 = "11111 "; Svar2="22222"; print $var1, $var2, "\n"; $, = " "; print $var1, $var2, "\n"; Esimene prindilause prinditakse: 1111122222, samas kui teise prindilause täitmisel saame stringi: 11111 22222
    TÄHELEPANU Kui määrate erimuutujate $\ ja $ väärtused, rakendub nende mõju kõikidele järgnevatele funktsiooni print() väljakutsetele.
    Kui prindifunktsioonis failideskriptorit pole määratud, siis vaikimisi tehakse väljund standardsesse väljundfaili STDOUT deskriptoriga ja kui väljundnimekirja pole määratud, siis kuvatakse spetsiaalse muutuja $_ sisu. . Funktsiooni print() deskriptori vaikeseadet saab muuta standardse select() funktsiooniga. Parameetriteta väljakutsumisel tagastab see funktsioonide print() ja write() praeguse vaikeväljundfaili deskriptori. Kui sellele edastatakse üks parameeter, peab see parameeter olema faili deskriptor. Sel juhul tagastab see ka praeguse vaikekäepideme ja muudab selle talle edastatud parameetriga määratud käepidemeks. Kasutusnäide valige funktsioonid() on toodud allpool. # Salvesta praegune vaikekäepide ja määra # F1 uus vaikekäepide $oldfilehandle = select(Fl); # Väljund Fl-deskriptoriga seotud faili print $rida; # Taasta vana vaikekäepide select($oldfilehandle); # Väljund vana deskriptoriga seotud faili print $line; Nagu juba märgitud, tõlgendatakse Perlis olevaid faile baitide struktureerimata voogudena. Seda operatsiooniga<> ja print() funktsioon, mida me vastavalt loeme või kirjutame terve baitide jada, mida me nimetame "kirjutamiseks", ei ole kuidagi seotud ühegi konkreetse failistruktuuriga. Need toimingud on lihtsalt korraldatud nii, et üks loeb ja teine ​​kirjutab baitide jadasid. Tegelikult saame lugeda ja kirjutada teavet faili baithaaval. Iga avatud faili jaoks luuakse süsteemimuutuja, mis jälgib selle hetkeasendit ehk asukohta failis, kust lugemisfunktsioonid loevad ja kirjutamisfunktsioonid infot kirjutavad. Seetõttu võime öelda, et lugemis-/kirjutustoimingud tehakse faili praegusest asukohast. Iga lugemis-/kirjutusoperatsioon liigutab faili praeguse asukoha kursorit loetud või kirjutatud baitide arvu võrra. Kui näiteks 80-baidist kirjet on loetud faili algusest peale, siis järgmine lugemis- või kirjutamisoperatsioon algab faili positsioonilt 81 baiti. Praeguse asukoha määramiseks failis kasutatakse funktsiooni tell(), mille ainsaks parameetriks saab olla faili deskriptor. Tagastab antud failideskriptoriga seotud faili praeguse asukoha. Sama funktsioon ilma parameetrita tagastab praeguse asukoha failis, mille jaoks programmis viimati lugemisoperatsioon tehti. Faili praegust asukohta muudetakse automaatselt vastavalt sooritatud lugemis-/kirjutusoperatsioonidele, kuid seda saab ka eksplitsiitselt muuta seek() funktsiooni abil, mis edastab parameetritena faili deskriptori, nihke ja võrdluspunkti. Deskriptoriga seotud faili jaoks määratakse uus praegune asukoht, mis on nihutatud parameetriga OFFSET määratud baitide arvuga võrdluspunkti suhtes: seek DETAILS, OFFSET, REFERENCE_POINT; Parameeter REFERENCE_POINT võib võtta ühe kolmest väärtusest: 0 – faili algus, 1 – praegune asukoht, 2 – faili lõpp. Nihe võib olla kas positiivne või negatiivne. See on faili lõpu suhtes negatiivne, faili alguse suhtes positiivne ja praeguse asukoha suhtes võib olla kas positiivne või negatiivne. Võrdluspunkte saate määrata ka nimeliste konstantide SEEK_SET, SEEK_CUR ja SEEK_END abil, mis on määratletud Perliga kaasas olevas paketis IO::Seekable, mis muudab programmi loetavamaks. Need konstandid nende loetlemise järjekorras vastavad faili algusele, praegusele asukohale ja faili lõpule. Nende nimeliste konstantide kasutamiseks tuleb loomulikult see moodul programmi use märksõna abil kaasata. Näiteks järgmised laused määravad samad praegused failipositsioonid: use IO::Seekable: seek FILE1, 5, 0; otsi FILE2, 5, SEEK_SET; Mitte keeles erifunktsioonid hüpata faili algusesse või lõppu. Kui peate faili paigutama algusesse või lõppu, peaksite funktsiooni seek() kutsumisel kasutama vastavate võrdluspunktide suhtes nullnihet: seek FILE1, 0, 0; # Mine faili otsimise algusesse FILE1, 0, 2; # Hüppa faili lõppu Lisaks juba tuttavatele failikirjete lugemise toimingutele<> ja readline(), pakub Perl failide sisu lugemiseks veel kahte funktsiooni, getc() ja read(). Esimene loeb failist ühe baidi, teine ​​​​aga teatud pikkusega kirjeid, st teatud pikkusega baitide jada. Funktsioon getc() loeb ja tagastab faili praeguses asukohas oleva märgi, mille deskriptor on parameetrina edastatud, või määratlemata väärtuse, kui faili lõppu jõutakse või tekib tõrge. Kui funktsiooni kutsutakse ilma parameetrita, loeb see tähemärgi standardsest sisendfailist STDIN. getc; # Loe tähemärki STDIN getc F1-st; # Loe tähemärki faili praeguses asukohas # deskriptoriga F1 Funktsioon read() loeb määratud arvu baite, alustades selle praegusest asukohast. Seda saab kutsuda kolme või nelja parameetriga ja selle väljakutse on: read DECRIPTOR, VARIABLE, LENGTH [,OFFSET]; See funktsioon loeb parameetri LENGTH täisarvu väärtusega määratud baitide arvu parameetriga VARIABLE määratud skalaarmuutujasse failist, mille deskriptor on määratud esimese parameetriga DESCRIPTOR. Tagastusväärtus on loetud baitide tegelik arv, 0, kui proovite lugeda faili lõpus, ja määratlemata, kui ilmnevad muud vead. Valikuline parameeter OFFSET määrab, millise baidi järel muutuja VARIABLE sisu failist loetud kirje salvestatakse. Sellel võib olla ka negatiivne nihe -n (n on täisarv). See tähendab, et muutuja VARIABLE sisust jäetakse välja viimased n baiti ja ülejäänud reale lisatakse failist loetud kirje. Nimekiri 6.10 loeb teatud pikkusega kirjeid in.dat-failist, mis sisaldab kolme rida andmeid: ******** * PERL * ******** Loend 6.10. Teatud pikkusega rekordite lugemine #! perl -w open(F1, "in.dat") või die "Viga faili avamisel: $!"; $str = "1234567890"; loe F1, $str, 9; # Lugege üheksa baiti # muutujasse $str ilma nihketrükita $str,"\n"; # $str = "********\n" loe F1, $str, 8, pikkus($str); print $str,"\n"; # $str - "*******\n* PERL *" Loendis 6-10 kasutatakse pikkus() funktsiooni, et määrata skalaarmuutujas sisalduvate märkide (baitide) arv. Pärast esimest lugemisoperatsiooni hävis muutuja $str sisu, kuna see read() funktsioon kutsuti välja ilma segaduseta. Teisel lugemisel salvestati muutujas $str salvestatud andmed täielikult. Pange tähele, et reavahetusmärki, mis sisaldub faili in.dat esimesel real, võetakse arvesse ka siis, kui funktsioon read() loeb teatud pikkusega kirjeid. Te ei tohiks seda asjaolu unustada, lugedes teavet "mitmerealisest" failist, millel on funktsioon Read ().

    Puhverdamata sisend/väljund

    Funktsioonid failist sysread() lugemine, faili syswrite() kirjutamine ja praeguse faili asukoha osuti sysseek() seadmine on analoogid funktsioonidele read(), print() ja seek(), mida oleme käsitlenud, kuid erinevalt viimastest pääsevad nad otse juurde vastavatele süsteemi toimimisfunktsioonidele, mitte aga standardsetele C I/O teegi funktsioonidele, jättes sellega mööda nende funktsioonide loodud puhvrist failide lugemiseks ja kirjutamiseks. Pange tähele, et puhverdatud tell () funktsioonil pole analoogi, selle funktsionaalsust realiseerib funktsioon sysseek (). Puhverdamata lugemis- ja kirjutamisfunktsioonide kutsumisel edastatakse neile sama parameetrite komplekt, mis vastab täielikult lugemisfunktsiooni parameetritele: sysread DECRIPTOR, VARIABLE, LENGTH [,OFFSET]; syswrite HANDLE, VARIABLE, LENGTH [,OFFSET]; Nende funktsioonide tagastusväärtus on vastavalt faili loetud või kirjutatud baitide tegelik arv, 0, kui faili lõpp on saavutatud, või undef, kui ilmneb viga. Vastavalt sellele vastab funktsiooni sysseek() parameetrite komplekt täielikult funktsioonile seek() edastatud parameetritele: sysseek DESCRIPTOR, OFFSET, REFERENCE POINT; Kõik, mis on öeldud funktsiooni seek() kasutamise kohta, kantakse täielikult üle selle puhverdamata vastele. Puhverdatud tell()-operatsiooni funktsionaalsus realiseeritakse järgmise funktsiooni sysseek() väljakutsega: $position = sysseek Fl, 0, 1; # Failikursori praegune asukoht Programm demonstreerib puhverdamata I/O funktsioonide kasutamist faili sisu töötlemiseks. #! perl -w kasutab Fcntl; # Ava fail lugemis-/kirjutusrežiimis sysopen F1, "in.dat", O_RDWR; # Loe 14-baidist plokki $read = sysread F1, $string, 14; hoiatada "Loe $loe baite 14 asemel\n", kui $loe != 14; # Seadke praegune asukoht (15 baiti võrra) $positsioon = sysseek Fl, 0, 1; die "Positsiooniviga: $!\n", kui pole määratud $positsioon; # Kirjuta string praegusesse asukohta $string = "Uus väärtus"; $written = syswrite F1, $string, pikkus($string); die "Viga kirjutamisel: $!\n" if $written != pikkus($string); # Sule fail sulge F1 või sure $!; Puhverdamata I/O-funktsioonidega töötades peaksite alati kontrollima lugemise, kirjutamise või asukoha toimingu lõpetamist. Standardne süsteem I/O, mille kaudu realiseeritakse puhverdatud I/O, kontrollib ise määratud toimingute sooritamist ja vastutab selle eest, kui protsess salvestuse keskel mingil põhjusel katkes. Puhverdamata I/O puhul peab programmeerija selle eest hoolitsema.