Prace se soubory


Se soubory se v jazyce Perl pracuje pomoci tzv. filehandles. Filehandel - logicke jmeno souboru je retezec psany velkymi pismeny napr. SOUBOR.

Na zacatku uvedme priklad programu v jazyce Perl, ktery opise obsah souboru na obrazovku, tj. ma stejnou funkci jako prikaz cat v UNIXu.

#!/usr/local/bin/perl
#
# Program otevre soubor, precte, vypise obsah souboru na obrazovku a opet soubor uzavre.


$file = '/etc/passwd';		# jmeno souboru je ulozeno do promenne
open(INFO, $file);		# otevreni souboru
@lines = <INFO>;		# nacteni obsahu souboru do pole
close(INFO);			# uzavreni souboru
print @lines;			# tisk pole

Funkce open otevira soubor jako vstupni (tj. pro cteni). Prvni parametr je filehandle, logicke jmeno souboru. Druhy parametr je jmeno souboru vcetne cesty. V nasem prikladu je jmeno souboru s cestou ulozeno v promenne $file

Funkce close ukonci praci se souborem.

Nektera logicka jmena souboru jsou preddefinovana a je mozne je v programu pouzit.

<STDIN> standardnim vstup
<STDOUT> standardni vystup
<STDERR> standardni chybovy vystup
<ARGV> soubory uvedene na prikazove radce

Priklad: Pri spusteni programu program.pl nasledujicim prikazem

perl program.pl arg1.dat arg2.dat <input1.dat >output.dat
<STDIN> reprezentuje obsah souboru input1.dat
<STDOUT> reprezentuje vystup do souboru output.dat
<STDERR> je chybovy vystup na obrazovku
<ARGV> cte ze souboru arg1.dat, jakmile precte posledni zaznam pokracuje ctenim souboru arg2.dat
Funkce open muze otevirat soubor jako vystupni (tj. pro zapis).
Vystupni soubor se otevre pridanim znaku > pred jmeno souboru.Pomoci znaku > se vytvori novy soubor, v pripade, ze soubor tehoz jmena jiz existuje, pak se existujici soubor prepise. Chcete-li otevrit existujici soubor a rozsirit jej, pak pridejte znaky >> pred jmeno souboru:
open(INFO, $file);      # otevreni souboru pro vstup
open(INFO, ">$file");	# otevreni souboru pro vystup
open(INFO, ">>$file");	# otevreni souboru pro rozsireni
open(INFO, "<$file");	# otevreni souboru pro vstup

Pokud chcete zapsat do souboru, otevrete soubor pro vystup a prikaz print pouzijete s parametrem filehandle. K zapsani retezce do souboru s filehandlem INFO pouzijte prikaz:

print INFO "Radek zapsany do souboru.\n";

K otevreni standadniho vstupu (obvykle klavesnice) a standardniho vystupu (obrazovka) muzete pouzit:

open(SOUB, '-');	# Otevreni standardniho vstupu
open(SOUB, '>-');	# Otevreni standardniho vystupu
V prikladu uvedenem na zacatku kapitoly jsou informace cteny ze souboru. Soubor ma logicke jmeno INFO. Obsah souboru se cte jednoduse tak, ze se promenne priradi logicke jmeno souboru uzavrene ve spicatych zavorkach.
Radek
@lines = <INFO>;
tedy precte soubor /etc/passwd do pole @lines.
Vsimnete si, ze vyraz <INFO> precte cely soubor na jeden pruchod. Je tomu tak proto, ze cteni probiha v kontextu promenne pole. Pokud by @lines bylo nahrazeno scalarni promennou $lines, pak by byla prectena vzdy jen nasledujici radka. Casto se cte soubor pomoci cyklu while.
while ($lines = <INFO>) {
      print $lines; 
}
V obou zpusobech cteni je prectena radka ulozena do promenne i se znakem konce radku.

Nasledujici priklad cte data zadavana uzivatelem z klavesnice, az do zadani prazdneho retezce. Prectena data opisuje na obrazovku.

while ($_ = <STDIN>) {
      print; 
}
Prikaz print implicitne pracuje s promennou $_, proto neni uveden v prikazu print parametr. Podobne i pri cteni ze souboru jsou data implicitne ukladana do promenne $_. Proto je mozne predchozi priklad zapsat zkracene:
while (<STDIN>) {
      print; 
}

Cviceni

Priklad 2. Opravte program uvedeny na zacatku kapitoly tak, aby cetl soubor prac.txt ulozeny v aktualnim adresari po radcich a vypisoval na zacatku kazde radky poradove cislo radky. Uvadime jedno z moznych reseni.


Dalsi kapitola | Predchozi kapitola kapitola | Obsah