E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\28.DOC 463
Rozdzia³ 28. ¨ Perl 479
Tim Parker
W tym rozdziale:
u Język Perl
u Tworzenie i uruchamianie programów w języku Perl
u Dane
u Tablice
u Elementy strukturalne
u Funkcje
u Operatory
u Konwertowanie programów do języka Perl
Język Perl (ang. Practical Extraction and Report Language) jest językiem interpretowanym, opracowanym przez Larry'ego Walla. Jego pierwotnym przeznaczeniem było zastąpienie takich, języków jak awk, służących do przetwarzania danych tekstowych. W tym rozdziale omówimy następujące tematy:
u koncepcja języka Perl,
u tworzenie i uruchamianie programów w języku Perl,
u dane, zmienne i tablice,
u elementy strukturalne,
u funkcje.
Po przeczytaniu tego rozdziału powinieneś orientować się w przewagach języka Perl nad innymi językami programowania. Będziesz również potrafił pisać proste programy, ułatwiające codzienną pracę z systemem Linux.
Jak zaznaczono już wcześniej, język Perl zaprojektowany został do obsługi plików tekstowych. Jeśli więc znasz choć trochę język awk (opisany w rozdziale 25. „gawk”), nie powinno Cię dziwić, że przejął z niego wiele konstrukcji. Perl łączy w sobie najlepsze cechy języków C, sed, awk i języków dostępnych w interpreterach poleceń powłoki, takich jak bash czy tcsh.
Perl jest podobny do języków powłoki zarówno pod względem działania, jak i składni. Istnieje jednak kilka różnic, o których nie sposób nie wspomnieć. Jedną z największych jest fakt, że nie jest to język czysto interpretowany. Programy w języku Perl są najpierw wczytywane w całości, następnie zamieniane na postać pośrednią, a dopiero potem wykonywane, natomiast programy powłoki są wczytywane i wykonywane wiersz po wierszu. Dzięki temu duże programy pisane w języku Perl wykonywane są znacznie szybciej niż skrypty powłoki. Przed wykonaniem sprawdzana jest również składnia poleceń w całym programie, co pozwala uniknąć sytuacji, w których program zatrzymuje się z powodu błędu składniowego, po przetworzeniu części danych – co bywa sytuacją nadzwyczaj kłopotliwą.
Fakt, że Perl nie jest językiem czysto interpretowanym, jest również w pewnym sensie wadą, ponieważ nawet niewielkie programy muszą zostać zamienione na postać pośrednią, przez co ich wykonanie staje się wolniejsze niż w przypadku skryptów powłoki. Nie jest to jednak szczególnie poważny problem i mało kto się nim przejmuje.
Proces tworzenia programu w języku Perl jest prawie identyczny, jak w przypadku skryptów powłoki. Program składa się z jednego lub więcej poleceń, umieszczonych w pliku tekstowym. Najpierw więc należy stworzyć taki plik, na przykład używając dowolnego edytora tekstów. Zacznijmy od bardzo prostego programu, wyświetlającego komunikat Witaj!:
#!/usr/bin/perlprint "Witaj!\n";
Pierwszy, wyglądający nieco dziwnie wiersz, informuje interpreter poleceń, jakiego programu należy użyć do przetworzenia pozostałej części pliku. Drugi wiersz powoduje wydrukowanie napisu Witaj! i przejście do następnego wiersza. Można tu zauważyć duże podobieństwo do języka C.
Aby uruchomić program, musisz zrobić jeszcze jedną rzecz: przypisać mu prawo do wykonywania. Jeśli plik nazywa się hello, można zrobić to w następujący sposób:
chmod +x hello
Teraz można już uruchomić program, wpisując polecenie
hello
Spowoduje ono wywołanie interpretera języka Perl, który przetworzy cały program, a następnie uruchomi skompilowany kod.
Można również uruchamiać interpreter języka Perl, przekazując nazwę programu, który ma zostać wykonany, jako argument wywołania, na przykład tak:
perl hello
Na najniższym poziomie Perl rozróżnia dwa typy danych: numeryczne i tekstowe. W tym podrozdziale dowiesz się, jak typy te są obsługiwane i jak ich używać w programach. Na początek zajmijmy się zmiennymi i ich użyciem.
Zmienne w języku Perl obsługiwane są podobnie jak w skryptach powłoki. Podstawowa różnica polega na tym, że nazwę zmiennej należy w Perlu poprzedzać znakiem $ zarówno przy przypisywaniu wartości, jak i przy odczycie (w skryptach powłoki podczas przypisywania wartości nie używa się znaku $). Poniższe polecenie przypisuje zmiennej pozdr wartość Witaj!:
$pozdr="Witaj!";
W skryptach powłoki analogiczne polecenie miałoby postać:
pozdr="Witaj!" lub set pozdr = "Witaj!" (w interpreterze tcsh).
W odróżnieniu od większości skryptów powłoki, Perl ignoruje spacje po obu stronach znaku równości, pozwalając programiście na dowolność w tym zakresie.
Inna różnica polega na tym, że operacje na zmiennych wykonuje się bezpośrednio, nie używając dodatkowo polecenia expr. Przykładowo, polecenie
$a=1+2;
spowoduje przypisanie do zmiennej $a wartości 3. Jeśli wprowadzisz polecenia
$a=1+2;$b=3*$a;
zmienna $b będzie miała wartość 9.Tego właśnie oczekiwaliśmy, ale skąd Perl wie, czy dana jest tekstowa, czy numeryczna? Otóż nie wie tego. Za każdym razem, gdy zmienna (lub stała) jest używana jako argument operatora arytmetycznego, jest ona zamieniana na postać numeryczną. W naszym przykładzie wszystko jest w porządku, ponieważ zmienna $a zawiera wartość 3. Co jednak byłoby, gdyby zawierała na przykład literę u (która nie reprezentuje żadnej wartości liczbowej)? Perl radzi sobie z tym w niezbyt elegancki sposób – jeśli zmiennej nie można przekształcić na liczbę, jest ona traktowana jako zero. Domyślnie Perl nawet nie informuje o takiej konwersji, możesz jednak tego zażądać, wywołując interpreter perl z opcją –w.
Wszystkie liczby, również całkowite, zapisywane są w Perlu w formacie zmiennoprzecinkowym. Nie oznacza to, że nie możesz używać wartości całkowitych, ale i tak będą one traktowane jako liczby rzeczywiste.
Perl udostępnia zestaw operatorów, których można używać do przeprowadzania porównań i podstawowych operacji arytmetycznych. Tabela 28.1 zawiera niektóre z nich.
Tabela 28.1. Operatory arytmetyczne
Operator
Opis
op1 + op2
Suma
op1 – op2
Różnica
op1 * op2
Iloczyn
op1 / op2
Iloraz
op1 ** op2
op1 do potęgi op2
op1 % op2
o1p modulo op2
op1==op2
Zwraca wartość logiczną „prawda”, jeśli liczby są równe.
op1!=op2
Zwraca wartość logiczną „prawda”, jeśli liczby są różne.
op1<op2
Zwraca wartość logiczną „prawda”, jeśli op1 jest mniejszy niż op2.
op1>op2
Zwraca wartość logiczną „prawda”, jeśli op1 jest większy niż op2.
op1<=op2
Zwraca wartość logiczną „prawda”, jeśli op1 jest mniejszy lub równy op2.
op1>=op2
Zwraca wartość logiczną „prawda”, jeśli op1 jest większy lub równy op2.
Łańcuchy znaków zwykle zawierają znaki alfanumeryczne (wielkie i małe litery, cyfry i znaki przestankowe). Perl nie odróżnia tych znaków od znaków niedrukowalnych, co oznacza, że można używać tego języka do przetwarzania plików binarnych.
Łańcuch znaków może być zapisany w Perlu na dwa sposoby – przez otoczenie go znakami pojedynczych lub podwójnych cudzysłowów. Łańcuch otoczony podwójnym cudzysłowem zachowuje się mniej więcej tak samo, jak w języku C. Można w nim użyć symboli specjalnych, poprzedzonych znakiem lewego ukośnika (ang. backslash). Ich lista zamieszczona jest w tabeli 28.2.
Tabela 28.2. Znaki specjalne dostępne w języku Perl
Symbol
\a
Powoduje wygenerowanie krótkiego dźwięku.
\b
Usuwa znaku przed kursorem (Backspace).
\cD
Pozwala umieścić w tekście dowolny znak niedrukowalny (w tym przypadku Control+D).
\f
Przejście do nowej strony.
\e
Znak Escape (kod 27).
\E
Zamyka obszar działania znaków \L i \U.
\l
Powoduje, że litera następująca po tym symbolu będzie traktowana jako mała litera.
\L
Powoduje, że wszystkie litery następujące po tym symbolu, aż do napotkania symbolu \E, będą traktowane jako małe litery.
\n
Nowy wiersz.
\r
Powrót karetki.
\t
Znak tabulacji.
\\
Lewy ukośnik (\).
\"
Cudzysłów.
\u
Powoduje, że następna litera następująca po tym symbolu będzie traktowana jako wielka litera.
\U
Powoduje, że wszystkie litery następujące po tym symbolu, aż do napotkania symbolu \E, będą traktowane jako wielkie litery.
Wewnątrz tekstu otoczonego podwójnym cudzysłowem możliwe jest również podstawienie wartości zmiennej. Przykładowy fragment programu
$imie="Wojtek";print "Czesc $imie, jak się masz?";
spowoduje wyświetlenie napisu
Czesc Wojtek, jak się masz?
Łańcuchy znaków otoczone pojedynczymi cudzysłowami różnią się od opisanych poprzednio tym, że znaki specjalne nie są w nich interpretowane, za wyjątkiem znaku ' oraz \. Po napotkaniu pierwszego z nich Perl uznaje, że jest to koniec łańcucha. Oznacza to, że jeśli chcesz wstawić pojedynczy cudzysłów do łańcucha znaków ujętego w pojedyncze cudzysłowy, musisz poprzedzić go znakiem \. Ta sama reguła dotyczy umieszczania w łańcuchach znaku \ (lewy ukośnik).
Przykładowo, jeśli chcesz wypisać tekst Don't do that! i przejść do następnego wiersza, powinieneś wprowadzić następujące polecenie:
print 'Don\'t do that!',"\n";
Pamiętaj, że jeśli umieścisz symbol \n wewnątrz tekstu otoczonego pojedynczym cudzysłowem, zostanie on wydrukowany (na ekranie pojawią się znaki \n) i nie nastąpi przejście do nowego wiersza.
Podobnie jak w przypadku liczb, również dla łańcuchów znaków dostępnych jest w Perlu wiele operatorów – najważniejsze zebrano w tabeli 28.3.
...
Wolf-1