Prßce se soubory


Se soubory se v jazyce Perl pracuje pomocφ tzv. filehandles. Filehandel - logickΘ jmΘno souboru je °et∞zec psan² velk²mi pφsmeny nap°. SOUBOR.

Na zaΦßtku uve∩me p°φklad programu v jazyce Perl, kter² opφÜe obsah souboru na obrazovku, tj. mß stejnou funkci jako p°φkaz cat v UNIXu.

#!/usr/local/bin/perl
#
# Program otev°e soubor, p°eΦte, vypφÜe obsah souboru na obrazovku a op∞t soubor uzav°e.


$file = '/etc/passwd';		# jmΘno souboru je ulo₧eno do prom∞nnΘ
open(INFO, $file);		# otev°enφ souboru
@lines = <INFO>;		# naΦtenφ obsahu souboru do pole
close(INFO);			# uzav°enφ souboru
print @lines;			# tisk pole

Funkce open otevφrß soubor jako vstupnφ (tj. pro Φtenφ). Prvnφ parametr je filehandle, logickΘ jmΘno souboru. Druh² parametr je jmΘno souboru vΦetn∞ cesty. V naÜem p°φkladu je jmΘno souboru s cestou ulo₧eno v prom∞nnΘ $file

Funkce close ukonΦφ prßci se souborem.

N∞kterß logickß jmΘna soubor∙ jsou p°eddefinovanß a je mo₧nΘ je v programu pou₧φt.

<STDIN> standardnφm vstup
<STDOUT> standardnφ v²stup
<STDERR> standardnφ chybov² v²stup
<ARGV> soubory uvedenΘ na p°φkazovΘ °ßdce

P°φklad: P°i spuÜt∞nφ programu program.pl nßsledujφcφm p°φkazem

perl program.pl arg1.dat arg2.dat <input1.dat >output.dat
<STDIN> reprezentuje obsah souboru input1.dat
<STDOUT> reprezentuje v²stup do souboru output.dat
<STDERR> je chybov² v²stup na obrazovku
<ARGV> Φte ze souboru arg1.dat, jakmile p°eΦte poslednφ zßznam pokraΦuje Φtenφm souboru arg2.dat
Funkce open m∙₧e otevφrat soubor jako v²stupnφ (tj. pro zßpis).
V²stupnφ soubor se otev°e p°idßnφm znaku > p°ed jmΘno souboru.Pomocφ znaku > se vytvo°φ nov² soubor, v p°φpad∞, ₧e soubor tΘho₧ jmΘna ji₧ existuje, pak se existujφcφ soubor p°epφÜe. Chcete-li otev°φt existujφcφ soubor a rozÜφ°it jej, pak p°idejte znaky >> p°ed jmΘno souboru:
open(INFO, $file);      # otev°enφ souboru pro vstup
open(INFO, ">$file");	# otev°enφ souboru pro v²stup
open(INFO, ">>$file");	# otev°enφ souboru pro rozÜφ°enφ
open(INFO, "<$file");	# otev°enφ souboru pro vstup

Pokud chcete zapsat do souboru, otev°ete soubor pro v²stup a p°φkaz print pou₧ijete s parametrem filehandle. K zapsßnφ °et∞zce do souboru s filehandlem INFO pou₧ijte p°φkaz:

print INFO "╪ßdek zapsan² do souboru.\n";

K otev°enφ standadnφho vstupu (obvykle klßvesnice) a standardnφho v²stupu (obrazovka) m∙₧ete pou₧φt:

open(SOUB, '-');	# Otev°enφ standardnφho vstupu
open(SOUB, '>-');	# Otev°enφ standardnφho v²stupu
V p°φkladu uvedenΘm na zaΦßtku kapitoly jsou informace Φteny ze souboru. Soubor mß logickΘ jmΘno INFO. Obsah souboru se Φte jednoduÜe tak, ₧e se prom∞nnΘ p°i°adφ logickΘ jmΘno souboru uzav°enΘ ve ÜpiΦat²ch zßvorkßch.
╪ßdek
@lines = <INFO>;
tedy p°eΦte soubor /etc/passwd do pole @lines.
VÜimn∞te si, ₧e v²raz <INFO> p°eΦte cel² soubor na jeden pr∙chod. Je tomu tak proto, ₧e Φtenφ probφhß v kontextu prom∞nnΘ pole. Pokud by @lines bylo nahrazeno scalßrnφ prom∞nnou $lines, pak by byla p°eΦtena v₧dy jen nßsledujφcφ °ßdka. ╚asto se Φte soubor pomocφ cyklu while.
while ($lines = <INFO>) {
      print $lines; 
}
V obou zp∙sobech Φtenφ je p°eΦtenß °ßdka ulo₧ena do prom∞nnΘ i se znakem konce °ßdku.

Nßsledujφcφ p°φklad Φte data zadßvanß u₧ivatelem z klßvesnice, a₧ do zadßnφ prßzdnΘho °et∞zce. P°eΦtenß data opisuje na obrazovku.

while ($_ = <STDIN>) {
      print; 
}
P°φkaz print implicitn∞ pracuje s prom∞nnou $_, proto nenφ uveden v p°φkazu print parametr. Podobn∞ i p°i Φtenφ ze souboru jsou data implicitn∞ uklßdßna do prom∞nnΘ $_. Proto je mo₧nΘ p°edchozφ p°φklad zapsat zkrßcen∞:
while (<STDIN>) {
      print; 
}

CviΦenφ

P°φklad 2. Opravte program uveden² na zaΦßtku kapitoly tak, aby Φetl soubor prac.txt ulo₧en² v aktußlnφm adresß°i po °ßdcφch a vypisoval na zaΦßtku ka₧dΘ °ßdky po°adovΘ Φφslo °ßdky. Uvßdφme jedno z mo₧n²ch °eÜenφ.


DalÜφ kapitola | P°edchozφ kapitola kapitola | Obsah