10. Operacje na plikach
W Perlu można korzystać z operacji, zarówno na plikach tekstowych, jak i
"nie formatowanych".
10.1. Operacje tekstowe
Perl może czytać i zapisywać pliki tekstowe przez deskryptory. Są one
zwyczajowo pisane dużymi literami. Pliki otwiera się komenda open. Ma
ona dwa argumenty: deskryptor pliku i jego nazwę. Kolejne linie są
czytane przez użycie deskryptora w ostrych nawiasach (<...>):
open(F,"data.txt");
while($line = <F>)
{
# zrob cos z linia
}
close F;
Argument reprezentujący nazwę pliku może posiadać jeden z kilku
prefiksów. Jeśli jest to <, plik jest otwarty do czytania (domyślny
prefiks), > do pisania - jeśli już istnieje, jest nadpisywany, zaś >>
do dopisywania. Przykłady :
open(PASSWD,"</etc/passwd");
while ($p = <PASSWD>)
{
chop $p;
@fields= split(/:/,$p);
print "Uzytkownik $fields[0] ma katalog $fields[6]\n";
}
close PASSWD;
open(LOG,">>user.log");
print LOG "$user zalogowal sie\n"; # dopisz do logu
$response = <STDIN>; # wczytaj linie
Są 3 predefiniowane deskryptory, o oczywistym znaczeniu: STDIN, STDOUT,
STDERR. Próba otwarcia ww. może spowodować dziwne efekty. Inaczej
zachowuje się Perl w przypadku wczytywania pliku do wektora. Wczytywany
jest cały plik, przy czym każda linijka to jeden element.
$file = "some.file";
open(F,$file);
@lines = <F>;
close F;
Jest to użyteczna cecha, winna jednak być używana z wielką uwagą.
Wczytanie całego pliku o nieznanej długości do pamięci może być
ryzykowne.
10.2. Pipe'y
Perl może używać funkcji open do uruchomienia komend shella, czytania i
pisania do nich na wzór funkcji popen z C. Jeśli nazwa pliku zaczyna się
od znaku pipe (|), nazwa ta traktowana jest jako komenda. Jest ona
wykonywana, zaś dane wejściowe można dostarczać przez print. Jeśli zaś
nazwa pliku kończy się |, zaś efekt wyjściowy można wykorzystywać przy
pomocy składni <...> :
open(MAIL,"| mail root"); # wyslij poczte do root'a
print MAIL "uzytkownik \"Jas\" jest glupi\n";
close MAIL; # poczta jest wysylana
open(WHO,"who |"); # kto jest w systemie
while ($who = <WHO>)
{
chop $who;
($user,$tty,$junk) = split(/\s+/,$who,3);
print "$user jest na terminalu $tty\n";
}
close(WHO);
10.3. Dostęp do "nie formatowanych" plików
Perl może czytać bajty dzięki funkcjom sysread i syswrite. Z powodu
rozmiarów tego opracowania nie będą one dokładniej omawiane.
10.4. Użycie komendy print
Do tej pory było już kilka przykładów na użycie funkcji print. Użycie
jej jest bardzo różnorodne. Można osiągnąć ten sam efekt na kilka
sposobów. Ogólnie print pobiera serie ciągów znakowych, przedzielonych
przecinkami, interpoluje odpowiednio wartości, po czym wypisuje efekt na
ekranie. Często wraz z printem używa się operatora połączenia ciągów
(.). Poniższe przykłady dają ten sam efekt na ekranie:
print "Idz do 11.\n";
$level = 11;
print "Idz do ",$level,".\n";
print "Idz do $level.\n";
printf "Idz do %d.\n",$level;
print "Idz " . "do ". $level.".\n";
print join(' ',("Idz","do","$level.\n"));
Jak widać również funkcja printf z C jest dostępna. W rzeczywistości są
nieznaczne różnice w działaniu ww. wywołań. Z powodu braku miejsca nie
zostaną one wyjaśnione. Ponadto jak wynika z poprzednich przykładów
argument deskryptora pliku jest opcjonalny.