Perl/Operacje na plikach
Uchwyty plików
edytujAby 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
edytujPoznałeś już standardowe wejście (STDIN) oraz wyjście (STDOUT). Istnieje jeszcze standardowe wyjście błędów zwane STDERR.
Czytanie z pliku
edytujAby 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
edytujFunkcja 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
edytujTryby zapisu
edytujAby 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ć
edytujAby 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
edytujOto 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;