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