| Failai ir katalogai | 
PERL 
programose darbui su failais naudojami taip vadinami deskriptoriai, sujungiantys 
PERL procesą su konkrečiu failu arba kitu 
procesu. Deskriptoriai iš esmės gali būti laikomi kintamaisiais, nors jų 
varduose nenaudojami PERL kintamiesiem būdingi prefiksai
$ , @ , %.
Deskriptoriai paprastai PERL programose rašomi 
didžiosiomis raidėmis, taip išskiriant
juos programose. Praeitame skyriuje jau buvo kalbama apie standartinius 
deskriptorius STDIN STDOUT SRDERR, kurie atomatiškai sukuriami paleidžiant PERL 
programą (tai atlieka motininis procesas), tačiau panagrinėkime deskriptorius 
išsamiau.
 
Failų deskriptorius, failų atidarymas ir uždarymas
Deskriptorius - tai simbolinis vardas, naudojamas PERL programoje failo, įrenginio, lizdo (socket) ar programinio kanalo valdymui. Sukuriant deskriptorių, jis prijungiamas prie atitinkamo duomenų objekto ir naudojamas įvedimo/išvedimo operacijose. Deskriptorius sukuriamas atidarant failą funkcija open(). Jos sintaksė:
open(DESKRIPTORIUS,"failo_pavadinimas_ir_rėžimas");
   open(LOGFILE,">/temp/logfile.log");
Pavyzdyje sukuriamas deskriptorius LOGFILE ir susiejamas su failu /temp/logfile.log Failas atidaromas rašymo rėžimu (tai parodo simbolis ">"). Bet kurį failą galima atidaryti skaitymo, rašymo arba papildymo į failo galą rėžimu. Tai daroma prijungiant prefiksus prie failo pavadinimo:
     <   skaitymas;
     >   rašymas;
     >> papildymas
Jei prieš failo pavadinimą nenurodomas, joks prefiksas, tuomet 
pagal nutylėjimą jis atidaromas skaitymo rėžimu. Failą galima atidaryti ir skaitymo-rašymo režimu. Tam naudojamas 
simbolis + prieš aukščiau išvardintus
prefiksus. Pavyzdžiui:  +<    
+>   +>>. Kai naudojama +> 
, atidarant failą, jo turinys išvalomas, o esant 
rėžimui, aprašytam +>> išvedimas atliekamas į failo galą.
Kartais sukuriant failą, reikia apibrėžti tam tikras teises vartotojams, tuomet 
galima naudoti funkciją sysopen. 
Jos sintaksė:
sysopen(DESKRIPTORIUS, 
"failo_pavadinimas", rėžimas [,teisės]);
   sysopen(LOGFILE,"/temp/logfile.log", 
O_WRONLY | O_CREAT, 0600);
Čia failo_pavadinimas - tai failas be prefikso, o rėžimas - tai raktinis žodis, nurodantis rėžimą, kuriuo atidaromas failas; teisės - neprivalomas parametras, nustatantis failo teises. Žemiau pateiktas rėžimų reikšmių aprašymas.
| 
       
  | 
      
       Read only  | 
    
| 
       
  | 
      
       Write only  | 
    
| 
       
  | 
      
       Read and write  | 
    
| 
       
  | 
      
       Create the file if it doesn't exist  | 
    
| 
       
  | 
      
       Fail if the file already exists  | 
    
| 
       
  | 
      
       Append to the file  | 
    
| 
       
  | 
      
       Truncate the file  | 
    
| 
       
  | 
      
       Non-blocking access  | 
    
Sekanti lentelė parodo ryšį tarp funkcijų open ir sysopen naudojamų parametrų, apibrėžiančių failo atidarymo rėžimą.
| 
       Filename  | 
      
       Read  | 
      
       Write  | 
      
       Append  | 
      
       Create  | 
      
       Trunc  | 
      
       O_flags  | 
      
       Char  | 
    
|---|---|---|---|---|---|---|---|
| 
       < file  | 
      
       yes  | 
      
       no  | 
      
       no  | 
      
       no  | 
      
       no  | 
      
       RDONLY  | 
      
       
  | 
    
| 
       > file  | 
      
       no  | 
      
       yes  | 
      
       no  | 
      
       yes  | 
      
       yes  | 
      
       WRONLY TRUNC CREAT  | 
      
       
  | 
    
| 
       >> file  | 
      
       no  | 
      
       yes  | 
      
       yes  | 
      
       yes  | 
      
       no  | 
      
       WRONLY APPEND CREAT  | 
      
       
  | 
    
| 
       +< file  | 
      
       yes  | 
      
       yes  | 
      
       no  | 
      
       no  | 
      
       no  | 
      
       RDWR  | 
      
       
  | 
    
| 
       +> file  | 
      
       yes  | 
      
       yes  | 
      
       no  | 
      
       yes  | 
      
       yes  | 
      
       RDWR TRUNC CREAT  | 
      
       
  | 
    
| 
       +>> file  | 
      
       yes  | 
      
       yes  | 
      
       yes  | 
      
       yes  | 
      
       no  | 
      
       RDWR APPEND CREAT  | 
      
       
  | 
    
Funkcijos open ir 
sysopen grąžina reikšmes
true arba
false, priklausomai nuo to kaip pavyko 
atidaryti failą, todėl patartina pasitikrinti ar funkcija įvykdyta sėkmingai. 
Tam naudojamos funkcijos die() arba
warn(), kurios išveda į STDERR 
pranešimus, apibrėžtus jų parametruose ir užbaigia PERL programą. Pavyzdžiui:
open (DATAPLACE,">/tmp/dataplace") || die "Negalima sukurti failo /tmp/dataplace\n";
open(LOG, ">>logfile") || die "Negalima papildyti: $! \n"; # Kintamasis $! išveda sisteminį klaidos pranešimą
sysopen(SOURCE, $path, O_RDONLY) or die "Negalima atidaryti $path : $!\n";
open(LOG,">>log") || warn "Discarding logfile output\n";
Baigus darbą su failu, jis uždaromas naudojant funkciją close(). Jos sintaksė:
close(DESKRIPTORIUS);
Uždarinėti failus patartina tuomet, kai programoje atidaromas ir nuskaitomas daugiau nei vienas failas. Nuskaitant failą, naudojamas specialus kintamasis $. kuriame saugomas paskutinio perskaityto įrašo numeris. Neuždarius failo, šio kintamojo reikšmė išlieka ir gali klaidinti atliekant nuskaitymą iš kito failo. Šiaip, baigus programą, failai uždaromi automatiškai.
Failų nuskaitymas ir kitos funkcijos
Informacijos nuskaitymas iš failo vykdomas operacijos <> pagalba, kurios operandas yra failo, atidaryto skaitymo rėžimu, deskiptorius. Naudojant šią operaciją skaliariniame kontekste, nuskaitoma po vieną eilutę (įrašą), o nuskaitytos eilutės numeris saugomas kintamajame $. Masyvo kontekste iš karto nuskaitomos visos failo eilutės. Eilučių (įrašų) atskirimo simbolis apibrėžiamas kintamajame $/ kuris pagal nutylėjimą yra "\n". Tačiau jį galima keisti.
open (EP,"/etc/passwd") || die "Klaida:$!\n"; while (<EP>) { chomp; print "Slaptazodziu faile yra $_ \n"; # Išvedama po vieną eilutę }
 open (IN,"in.dat") || die "Klaida:$!\n";
$line1 = <IN>;                                # Nuskaitoma pirma eilutė
$line2 = <IN>;                                # Nuskaitoma antra eilutė
@rest = <IN>;                                 # Nuskaitomos likusios eilutės
 open (EP,"/etc/passwd") || die "Klaida:$!\n";
print <EP>;                                   # Į STDOUT išvedamas visas failas
close EP or die "Klaida:$!\n";
Norint išvesti informaciją į atidarytą rašymui failą, naudojama funkcija print, kurios pirmasis parametras yra failo deskriptorius. Jei deskriptorius nenurodomas, išvedimas pagal nutylėjimą atliekamas į STDOUT.
 print DESKRIPTORIUS, 
išvedama_info;
  print LOGFILE 
"Kintamojo \$max reikšmė $max\n";
  print STDOUT "Hello, world!\n";             
# Tas pats kaip: print "hi, world!\n"
Kitos naudingos funkcijos
 tell  DESKRIPTORIUS;
 Funkcija tell gražina esamą 
poziciją baitais faile, sujungtame su funkcijoje nurodytu
deskriptoriumi. Jei deskriptorius 
praleistas, parodoma pozicija paskutiniame nuskaitytame faile.
 seek  DESKRIPTORIUS, 
perstūmimas, atskaitos_pozicija; 
 Funkcija seek pozicionuoja 
pointerį faile, nurodytame deskriptoriuje.
Perstūmimas - tai skaičius baitų, per 
kuriuos reikia perkelti pointerį nuo 
atskaitos_pozicijos. Atskaitos pozicija gali turėti tris reikšmes: 0 - 
failo pradžia, 1 - esama pozicija, 2 - failo galas. Jei naudojamas modulis 
programoje IO::Seekable , vietoj 
skaičių galima naudoti tas pačias reikšmes turinčius raktinius žodžius: 
SEEK_SET,  SEEK_CUR,  SEEK_END. Pavyzdžiui:
 use IO::Seekable;
seek FILE1, 5, 0;
seek FILE2, 5, SEEK_SET;
 getc   
DESKRIPTORIUS;Funkcija getc 
gražina simbolį iš esamos pointerio pozicijos faile, sujungtame su funkcijoje 
nurodytu deskriptoriumi. Jei 
deskriptorius praleistas, gražinamas simbolis iš STDIN.
 read  DESKRIPTORIUS, 
kintamasis, ilgis[, perstūmimas]; 
 Funkcija read nuskaito
iš failo, surišto su deskriptoriumi
baitų skaičių, apibrėžtą parametre
ilgis į
kintamąjį .
Perstūmimas nurodo kiek baitų bus 
prijungta prie kintamojo.
 sysread  DESKRIPTORIUS, 
kintamasis, ilgis[, perstūmimas]; 
syswrite
 DESKRIPTORIUS, 
kintamasis, ilgis[, perstūmimas];
 
Tai nebuferizuoto nuskaitymo įrašymo funkcijos. Parametrų reikšmės analogiškos kaip ir funkcijos read atveju.
Failų tikrinimo operatoriai
Norint gauti informaciją apie failo atributus (teises, tipą, dydį) naudojama tokia PERL sintaksė:
 -raidė DESKRIPTORIUS
-raidė išraiška 
Išraiška sintaksėje suprantama kaip eilutė su failo pavadinimu ar skaliarinis kintamasis. Ši failo atributų tikrinimo operacija grąžina 1, jei failas turi tikrinamus atributus ir tuščią eilutę "" priešingu atveju. Jei parametre nurodytas failas neegzistuoja, gražinama reikšmė undef. Pavyzdžiai:
if (-e "index.html" && -e "index.cgi") {
    print "You have both styles of index files here.\n";
}
if (-x SOMEFILE) {
    print "File open on SOMEFILE is executable\n";
}
Žemiau pateiktoje lentelėje išvardintos visos galimos raidės ir jų reikšmės.
| 
       Raidė  | 
      
       Reikšmė  | 
    
|---|---|
      -r  | 
      
       File or directory is readable  | 
    
      -w  | 
      
       File or directory is writable  | 
    
      -x  | 
      
       File or directory is executable  | 
    
      -o  | 
      
       File or directory is owned by user  | 
    
      -R  | 
      
       File or directory is readable by real user, not effective 
      user (differs from   | 
    
      -W  | 
      
       File or directory is writable by real user, not effective 
      user (differs from   | 
    
      -X  | 
      
       File or directory is executable by real user, not 
      effective user (differs from   | 
    
      -O  | 
      
       File or directory is owned by real user, not effective 
      user (differs from   | 
    
      -e  | 
      
       File or directory exists  | 
    
      -z  | 
      
       File exists and has zero size (directories are never empty)  | 
    
      -s  | 
      
       File or directory exists and has nonzero size (the value is the size in bytes)  | 
    
      -f  | 
      
       Entry is a plain file  | 
    
      -d  | 
      
       Entry is a directory  | 
    
      -l  | 
      
       Entry is a symlink  | 
    
      -S  | 
      
       Entry is a socket  | 
    
      -p  | 
      
       Entry is a named pipe (a "fifo")  | 
    
      -b  | 
      
       Entry is a block-special file (like a mountable disk)  | 
    
      -c  | 
      
       Entry is a character-special file (like an I/O device)  | 
    
      -u  | 
      
       File or directory is setuid  | 
    
      -g  | 
      
       File or directory is setgid  | 
    
      -k  | 
      
       File or directory has the sticky bit set  | 
    
      -t  | 
      
       
  | 
    
      -T  | 
      
       File is "text"  | 
    
      -B  | 
      
       File is "binary"  | 
    
      -M  | 
      
       Modification age in days  | 
    
      -A  | 
      
       Access age in days  | 
    
      -C  | 
      
       Inode-modification age in days  | 
    
Failai UNIX operacinėje sistemoje yra siejami su indeksiniais deskriptoriais (inodes). Indeksinis deskriptorius - tai duomenų struktūra, kurią sudaro 13 laukų, kuriuose saugoma visa informacija apie failą.
Indeksinio deskriptoriaus struktūra
| 
       Lauko pavadinimas  | 
      
       Lauko reikšmė  | 
    
|---|---|
      dev  | 
      
       Įrenginio numeris failinėje sistemoje  | 
    
      ino  | 
      
       Indeksinio deskriptoriaus numeris  | 
    
      mode  | 
      
       Failo tipas ir teisės  | 
    
      nlink  | 
      
       Kietų ryšių (hard link) skaičius  | 
    
      uid  | 
      
       Failo savininko identifikacinis numeris  | 
    
      gid  | 
      
       Failo savininko grupės identifikacinis numeris  | 
    
      rdev  | 
      
       Įrenginio identifikatorius (specialių failų)  | 
    
      size  | 
      
       Failo dydis baitais  | 
    
      atime  | 
      
       Paskutinio kreipimosi į failą laikas (access time)  | 
    
      mtime  | 
      
       Modifikavimo laikas (modify time)  | 
    
      ctime  | 
      
       Indeksinio deskriptoriaus pakeitimo laikas  | 
    
      blksize  | 
      
       Bloko dydis  | 
    
      bloks  | 
      
       Faktiškas blokų skaičius, išskirtas failui  | 
    
Norint gauti indeksinio deskriptoriaus laukų reikšmes naudojama funkcija stat. Jos sintaksė:
 @var = stat DESKRIPTORIUS;
@var = stat išraiška;
 
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) 
= stat(...);
($uid, $gid) = (stat("/etc/passwd"))[4,5];
Funkcijos stat pagalba gaunama informacija ne tik apie failą, bet ir apie kietus ryšius (hard link) bei katalogus. Norint gauti informacija apie failo simbolinį ryšį, naudojama funkcija lstat. Sintaksė tokia pat kaip ir stat.
Operacijos su katalogais
UNIX operacinėje sistemoje katalogas laikomas specialaus formato failu, turinčiu tą pačią indeksinio deskriptoriaus struktūrą tik su kitokia rdev lauko reikšme. PERL darbui su katalogais naudojamos panašios funkcijos, kaip ir su failais t.y. nuskaitymo, įrašymo, uždarymo.
 opendir DESKRIPTORIUS, 
katalogo_pavadinimas;
    opendir FF, "/usr/local";
Funkcijos opendir pagalba sukuriamas deskriptorius nurodytam parametruose katalogui.
 readdir DESKRIPTORIUS;
    @dir = readdir FF;
Funkcija readdir nuskaito kataloge esančių failų pavadinimus ir priskiria juos masyvo elementams.
 rewinddir DESKRIPTORIUS;
    rewinddir 
FF;
Funkcija rewinddir esamą poziciją perstato į pradžią ir leidžia iš naujo nuskaityti katalogą.
 closedir DESKRIPTORIUS;
    closedir FF;
Funkcija closedir uždaro katalogą.
 mkdir Katalogo_pavadinimas, teisės;
    mkdir "/home/test/solver", 0644;
Funkcija mkdir sukuria katalogą. Parametrų sąraše nurodomas failo pavadinimas ir teisės.
Pavyzdys
 #! perl -w
opendir FDIR, "/usr/prog";
while ($name = readdir FDIR){
   next if -d $name;              
# Jei katalogas
   print ("$name: dvejetainis\n") if -B $name;
}
closedir FDIR;