Perl/Operacje na plikach

Z Wikibooks, biblioteki wolnych podręczników.
Poprzedni rozdział: Pętle
Następny rozdział: Modyfikatory

Uchwyty plików[edytuj]

Aby móc pracować z plikami musimy dowiedzieć się czym są uchwyty plików (ang. filehandler). Uchwyt jest identyfikatorem pliku dzięki któremu możemy perlowi wskazać o jaki plik nam chodzi. Aby odróżnić nazwę uchwytu od reszty kodu przyjęło się pisanie ich nazw dużymi literami. Oto prosty program otwierający plik:

 open(UCHWYT, 'nazwa_pliku');

Pewnie zastanawiasz się czym jest "open". Jest to wbudowana funkcja perla, która łączy UCHWYT z nazwa_pliku. Pozwala na otwarcie pliku. Jednak co się stanie jeśli plik nie istnieje? Program wyświetli błąd. Jednakże dobrze by było być na to przygotowanym. Tutaj z pomocą przychodzą nam operatory logiczne.

 open(UCHWYT, 'nazwa_pliku') or die "Nie można otworzyć pliku: $!";

Dzięki temu jeżeli próba otwarcia zakończy się niepowodzeniem zostaniemy o tym odpowiednio poinformowani. Zmienna $! zawiera komunikat błędu.

 close UCHWYT;

Jak zapewne się już domyśliłeś, funkcja close zamyka plik, a jako argument przyjmuje nazwę uchwytu.

Standardowe uchwyty[edytuj]

Poznałeś już standardowe wejście (STDIN) oraz wyjście (STDOUT). Istnieje jeszcze standardowe wyjście błędów zwane STDERR.

Czytanie z pliku[edytuj]

Aby odczytać plik, należy jego uchwyt wpisać pomiędzy tzw. operator wczytywania lini "<...>". Np: <UCHWYT>. Plik możemy wypisać linia po linii. Użyjemy w tym celu pętli while.

 open(UCHWYT, "f.txt");
 while (<UCHWYT>) {  # <UCHWYT> zwraca prawdę dopóki nie natrafi na koniec pliku
   $linia = $_;      # linia 3
   print $linia;     # i 4
 }
 close UCHWYT;

Linie 3 i 4 możemy zapisać krócej jako po prostu "print;".

Możemy także wczytać cały plik do tablicy, a potem ją wypisać. Jest to dobry sposób tylko dla niewielkich plików, ponieważ perl musi przechowywać cały plik w pamięci.

 open(UCHWYT, "f.txt");
 @linie = <UCHWYT>;  # czytanie do tablicy
 close (UCHWYT);
 print @linie;   # drukowanie tablicy
 ...

Tryb odczytu[edytuj]

Funkcja open jeżeli nie podamy jej trybu otwarcia, domyślnie ustawi go na tryb tylko do odczytu. To samo co robiliśmy powyżej można zapisać tak:

 open(UCHWYT, '<nazwa_pliku') or die "Nie można otworzyć pliku: $!";

Znak "<" mówi funkcji open aby otworzyła plik do odczytu. Między trybem a plikiem może być spacja. Tryb może być nawet jako osobny argument.

 open(UCHWYT, '<', 'nazwa_pliku') or die "Nie można otworzyć pliku: $!";

W następnym podrozdziale poznamy kolejny dwa tryby.

Zapisywanie do pliku[edytuj]

Tryby zapisu[edytuj]

Aby zapisać cokolwiek do pliku musimy poznać odpowiednie tryby.

 open(UCHWYT, '>', 'nazwa_pliku') or die "Nie można otworzyć pliku: $!";

Tryb ">" spowoduje, iż możemy zapisywać do pliku (ale bez możliwości odczytu). Jeżeli plik nie istnieje zostanie stworzony, a jeżeli istnieje - zostanie wyzerowany (tj. jego treść ulegnie skasowaniu).

 open(UCHWYT, '>>', 'nazwa_pliku') or die "Nie można otworzyć pliku: $!";

Dzięki ">>" możemy do pliku tylko dopisywać (także bez możliwości odczytu). Jeżeli plik nie istnieje zostanie stworzony.

Jak zapisać[edytuj]

Aby wpisać coś do pliku należy jako pierwszy argument funkcji print podać uchwyt pliku, a jako drugi treść do zapisania.

 open(UCHWYT, '>', 'nazwa_pliku') or die "Nie można otworzyć pliku: $!";
 print UCHWYT "przykladowa tresc"; # zapisywanie
 close UCHWYT;

Możemy oczywiście zapisywać do plików zawartości zmiennych.

Przykład[edytuj]

Oto program, który kopiuje całą treść jednego pliku i dopisuje ją do drugiego.

 open(PLIK_1, "<",  "plik1") or die "Nie można otworzyć pliku: $!";
 open(PLIK_2, ">>", "plik2") or die "Nie można otworzyć pliku: $!";
 while (<PLIK_1>) {
   print PLIK_2;    # dopisz do PLIK_2 linia po linii
 }
 close PLIK_1;
 close PLIK_2;
Poprzedni rozdział: Pętle
Następny rozdział: Modyfikatory