VII  Failipidemed

Filehandles
 

Programm ei ole asi iseeneses, ta peab suhtlema ka endast väljaspool oleva maailmaga. See tähendab, et arvuti klaviatuurilt peab ta suutma vastu võtta toksitavat, samuti mitmesugusel moel töötlema  faile, lisaks peab ta suutma  väljastada tulemusi kas ekraanile või salvestama neid kuhugi faili.

Selle tegevuse juhtimiseks  on kasutusele võetud nn. failipidemed . Need on olemuselt muutujad, mis saavad oma sisu käsuga open . Selle  vastandiks on käsk close, millega failipide antakse vabaks. Basic keeles on sama asi tuntud kui I/O kanal,  C++ -s  aga  kui stream.
  Failipide on seega nimi, mis antakse kas failile või seadmele või nn. konveierile (torule).  Perl lubab käsitleda paljusid faile ja failipidemetega seotud protsesse korraga.
Lihtsaim viis mingi faili sisu kättesaadavaks tegemiseks on:

open (SEESAM, "failinimi");         #avada lugemiseks.

Selle käsugu seotakse muutujaga SEESAM konkreetne fail.  Sellest failist lugemiseks kasutab Perl esitusviisi
$rida = <SEESAM>;
Toodud käsuga loetakse failist järjekordne rida, st. sisestatakse sümbolite jada kuni esimese vastutuleva reavahetuse sümbolini \n ja omistatakse saadu muutujale $rida.
   Tihti kasutatakse lugemiseks ka nn. ilmutamata kuju
<SEESAM>
 See tähendab, et faili rida loeti ainult spetsiaalmuutujasse $_ , aga seda viisi saab kasutada ainult konstruktsioonis
while (<SEESAM>) {  .......};

Failipideme moodustamisel on oma kindel roll täita nn. eesliidetel < , >, >> ja |   .

Eesliide    tähendab, et fail avatakse lugemiseks ja kuna see reziim on määratud vaikimisi reziimiks,   võib märgi ka ära jätta. Kui failinime ette on pandud märk   > ,  siis see tähendab uue faili avamist kirjutamiseks ( samanimeline olemasolev kustutatakse) ja eesliide    >>    tähendab olemasolevale faili täiendamist.

open (SeeSam, "<failinimi");      #avada lugemiseks.

open (seesaM, ">failinimi");        #avada kirjutamiseks

open (Seesam, ">>failinimi");     #avada lisamiseks

Perl puhul on mõnikord  märgitud, et failipidemed võiks  programmi teksti loetavuse huvides koosneda  suurtest tähtedest, aga see pole kohustuslik.

Eespoolkirjeldatu on failipidemete loomine tööks failidega, st, et open käsu teiseks argumendiks on faili nimi. Kuid see pole ainus võimalus, teiseks  argumendiks  võib olla ka mingi konveier tüüpi käsk.  Eristatakse kahte erinevat viisi  - püstkriips |  voib asuda käsu ees või käsu järel. Kui ees, siis igakordsel  failipideme esinemisel käsitletakse argumenti kui unix käsku, see täidetakse ja edaspidine tegevus sõltub antud käsust ja tolle  vajadustest.

open (SeesaM, "| väljastus-konveier-käsk");

Näiteks:

open (KIRI, "| mail uba");                       # otsustatakse saata kiri kasutajale   uba
print KIRI  "Kuidas \"konveier\"  t\366\366tab\?\n";        # Lisatakse kirjale sisu  (Kuidas "konveier" töötab?)
close KIRI;                                                   # kiri läheb teele

Siin unix käsk mail vajab täiendavat informatsiooni, selle ta saab kätte print käsuga ( muidugi peab   failipide olema sama, mis  open käsul korral).
 

print KIRI " \365\325  \344\304  \366\326  \374\334 \n";     # trükib   õÕ äÄ öÖ üÜ
 

Kui aga failipideme defineerimisel püstkriips  järgneb argumendile, siis kõigepealt täidetakse vastav (UNIX) käsk. Viimasest saadav info on nüüd edaspidiseks kättesaadav kasutades     < ... > konstruktsiooni;

open (OTSI," find . -print | ");      # kammib läbi kataloogi ja kõik selle alamkataloogid ning jätab meelde kõik failinimed, mis leiab
while ($file = <OTSI>) {                # loeb ridade kaupa saadud infot
       if ( $file =~ /.html/) {               # st. et kui failinimi sisaldab .html, siis tehakse midagi kasulikku
             print "$file \n";                    # kuna me pole tulemuse väljanägemise eest hoolitsenud, ei saa see just kõige ilusam.
       };
};
( Märkus: käsus $file =~ /.html/  kasutusel olev nn. mallvõrdlus on lähema vaatluse all järgmises osas.)

Perlis on kolm vaikimisi kasutatavat failipidet   STDIN, STDOUT, STDERR, mida ei pea märkima ja  mille sisu tegelikult on määratud operatsioonisüsteemiga Teie arvutis.  STDIN on reeglina klaviatuur ja STDOUT ekraan (nn. normaalne sisend- ja väljundkanal), nende ümberdefineerimine open käsuga võib  põhjustada arvuti  äraarvamatuid käitumisi. STDERR-i  kutsutakse veavooks, standardselt väljastatakse see ekraanile.

Programmilõigu

print STDOUT "Toksi midagi!   \a\a ";
$midagi = <STDIN>;
print STDOUT " See \"midagi\" oli: $midagi . \n";

saame  kirja panna samaväärsel kujul:

print  "Toksi midagi: \a\a\a ";
$r = <>;                                                          # NB! tühikut ei tohi märkide <> vahel olla!
print  " See \"midagi\" oli: $r.\n";
Küsimus: Kuhu trükitakse punkt, kas rea lõppu või algusse, miks?

Järgmine näide on sellest, kuidas mingist failist otsida read, mis sisaldavad veebi viidet kujul http:

while ($rida = <FI>) {
     if ($rida =~ /http:/){
         print $rida;
    };
};

 Perli rohkem  tundvad  programmeerijad teevad sama töö järgmiselt:

while(<FI>){print if /http:/};