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.