Perl/Operacje na plikach
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;