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:/};