28.DOC

(124 KB) Pobierz









Rozdział 28.
Perl









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.

Język Perl

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.

Tworzenie i uruchamianie programów w języku Perl

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/perl
print "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

Dane

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

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.

Liczby

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

Ł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

Opis

\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.

...

Zgłoś jeśli naruszono regulamin