28, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta


Rozdział 28.
Perl


Tim Parker

W tym rozdziale:

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:

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";

0x01 graphic

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.

Tabela 28.3. Operatory działające na łańcuchach znaków

Operator

Opis

op1 . op2

Łączy łańcuchy op1 i op2.

op1 x op2

Powtarza op1 op2 razy.

op1 eq op2

Zwraca wartość logiczną „prawda”, jeśli teksty są równe.

op1 ne op2

Zwraca wartość logiczną „prawda”, jeśli teksty są różne.

op1 lt op2

Zwraca wartość logiczną „prawda”, jeśli op1 jest mniejszy niż op2.

op1 gt op2

Zwraca wartość logiczną „prawda”, jeśli op1 jest większy niż op2.

op1 le op2

Zwraca wartość logiczną „prawda”, jeśli op1 jest mniejszy lub równy op2.

op1 ge op2

Zwraca wartość logiczną „prawda”, jeśli op1 jest większy lub równy op2.

Operatory plikowe

Podobnie jak języki powłoki, Perl udostępnia operatory działające na plikach i katalogach, pozwalające sprawdzić ich właściwości. Najbardziej przydatne z nich zebrane zostały w tabeli 28.4.

Tabela 28.4. Operatory plikowe

Operator

Opis

-B

Sprawdza, czy plik jest plikiem binarnym.

-d

Sprawdza, czy plik jest katalogiem.

-e

Sprawdza, czy plik istnieje.

-f

Sprawdza, czy plik jest zwykłym plikiem.

-r

Sprawdza, czy plik da się odczytać.

-s

Sprawdza, czy rozmiar pliku jest różny od zera.

-T

Sprawdza, czy plik jest plikiem tekstowym.

-w

Sprawdza, czy można pisać do pliku.

-x

Sprawdza, czy plik jest wykonywalny.

-z

Sprawdza, czy plik ma zerową długość.

Operatory te mogą być używane w dowolnych wyrażeniach. W poniższym przykładzie użyliśmy instrukcji if do sprawdzenia, czy w bieżącym katalogu znajduje się plik o nazwie .profile:

if (-e ".profile") {
print "Plik .profile znaleziony\n";
}

Tablice

Tablica to indeksowana lista elementów. W języku Perl dostępne są dwa typy tablic. Pierwszy z nich nie różni się od tablic znanych z innych języków programowania. Pozwala on na zapisanie elementu (tekstu lub liczby) do zmiennej mogącej przechować dowolną ilość takich elementów. Dostęp do nich jest możliwy przez indeksowanie tej zmiennej. Przykładowo, następująca instrukcja zapisuje łańcuchy znaków 1, luty i 1999 do tablicy o nazwie data:

@data=("1", "luty", "1999");

0x01 graphic

Liczba elementów przechowywanych w tablicy jest ograniczona wielkością dostępnej pamięci.

Jeśli chcesz uzyskać dostęp do danych zapisanych w tablicy data, musisz podać nazwę tablicy i odpowiedni indeks (indeksowanie zaczyna się od zera). Nazwę tablicy należy wówczas poprzedzić znakiem $, a nie @, ponieważ odwołujesz się nie do całej tablicy, tylko do jej elementu, który jest zwykłą zmienną. Aby na przykład przypisać wartość luty (przechowywaną jako drugi element tablicy data) zmiennej miesiac, powinieneś wydać polecenie:

$miesiac=$data[1];

0x01 graphic

Podobnie jak ma to miejsce w językach C i C++, w języku Perl indeksowanie tablicy zaczyna się od zera. Oznacza to, że na przykład tablica pięcioelementowa zawiera elementy o indeksach [0], [1], [2], [3] i [4], nie zawiera natomiast elementu o indeksie [5].

Tablice drugiego typu to tablice asocjacyjne (zwane również haszującymi). Są one podobne do zwykłych tablic, z tym, że indeksować je można wybranym przez użytkownika łańcuchem znaków lub liczbą.

Ponieważ dla tablicy asocjacyjnej możesz sam wybrać klucz, według którego dane będą indeksowane, przypisywanie i odczytywanie zapisanych wartości odbywa się nieco inaczej niż w przypadku zwykłych tablic. Aby przypisać wartość elementowi tablicy asocjacyjnej, musisz oprócz samej wartości podać również klucz, który będzie z nią związany. Na przykład, jeśli chcesz elementowi tablicy słowa o indeksie pozdr przypisać wartość Witaj!, powinieneś wydać polecenie:

$slowa{"pozdr"}="Witaj!";

Przed nazwą tablicy znajduje się znak $, ponieważ odnosisz się tylko do jednego elementu - czyli do zwykłej zmiennej. Operacje na całych tablicach wykonuje się przez poprzedzenie ich nazwy znakiem %:

%slowa2=%slowa;

Powyższe polecenie powoduje skopiowanie całej zawartości tablicy slowa do tablicy slowa2. Dostęp do elementu tablicy możliwy jest poprzez zdefiniowany wcześniej indeks:

$wartosc=$slowa{"pozdr"};

Oprócz operatorów, które mogą być używane również w odniesieniu do normalnych tablic, dla tablic asocjacyjnych dostępne są cztery nowe: keys, values, delete oraz each.

Operator keys zwraca tablicę słów indeksujących elementy tablicy asocjacyjnej. Poniższe polecenia spowodują, że w tablicy indeksy znajdą się łańcuchy pozdr i pozdr1:

$slowa{"pozdr"}="Witaj!";

$slowa{"pozdr1"}="Witam Cie";

@indeksy=keys(%slowa);

Pierwsze dwa polecenia przypisują wartości poszczególnym elementom tablicy asocjacyjnej slowa. Pierwsze powoduje przypisanie tekstu Witaj! do elementu o indeksie pozdr, drugie - tekstu Witam Cie do elementu o indeksie pozdr1.

Trzecie polecenie przypisuje wszystkie łańcuchy znaków będące indeksami elementów tablicy asocjacyjnej slowa do tablicy (zwykłej, nie asocjacyjnej) indeksy. Zauważ, że przed nazwą tablicy slowa znajduje się znak %, który informuje interpreter, że chodzi o całą tablicę, a nie o któryś z jej elementów.

0x01 graphic

Kolejność elementów w tablicy indeksy nie jest zdefiniowana. Może ona zawierać teksty (pozdr, pozdr1), ale równie dobrze może zawierać teksty (pozdr1, pozdr).

Operator values zwraca tablicę wszystkich wartości przechowywanych w tablicy asocjacyjnej. Poniższy program spowoduje, że tablica tablwart zawierać będzie elementy 123.5 i 105 (w dowolnej kolejności):

$ceny{"normalny"}=123.5;
$ceny{"wyprzedaz"}=105;
@tablwart=values(%ceny);

Pierwsze dwa polecenia przypisują odpowiednie wartości elementom tablicy asocjacyjnej ceny. Trzecie polecenie powoduje przypisanie elementom zwykłej tablicy tablwart wszystkich wartości przechowywanych w tablicy asocjacyjnej ceny.

Operator delete pozwala usuwać elementy tablicy asocjacyjnej. Usuwany jest zarówno klucz - indeks, jak i odpowiadająca mu wartość:

%kawa=("rozpuszczalna",5.20,"mielona",6.99, "capuccino", 2.15);

delete $kawa{"mielona"};

Pierwsze polecenie zapisuje trzy elementy do tablicy asocjacyjnej kawa. Drugie usuwa z niej element o indeksie mielona.

Operator each pozwala w łatwy sposób oddziaływać na wszystkie elementy tablicy asocjacyjnej. Jego pierwsze wywołanie zwraca pierwszy element tablicy, kolejne wywołania - następne elementy, aż do osiągnięcia ostatniego elementu. Poniższy fragment kodu powoduje wyświetlenie cen wszystkich gatunków kawy z poprzedniego przykładu.

while (($typ,$cena)=each(%kawa)) {
print "Kawa $typ kosztuje $cena zł\n";
}

Elementy strukturalne

Instrukcje strukturalne dostępne w języku Perl są podobne do znanych z innych języków programowania wysokiego poziomu. Opiszemy je skrótowo w tym podrozdziale.

Instrukcja blokowa

Instrukcje blokowe składają się z jednej lub więcej instrukcji otoczonych nawiasami klamrowymi. Ogólnie ich składnia jest następująca:

{
instr_1;
instr_2;
...
}

Instrukcji blokowych można użyć wszędzie tam, gdzie można użyć pojedynczych instrukcji. Najczęściej są one wykorzystywane do grupowania poleceń mających wykonywać się w pętlach (na przykład while albo for) lub warunkowo (w instrukcji if).

Instrukcja if

Instrukcja if używana jest do warunkowego wykonywania fragmentu programu. Jej składnia jest podobna do składni znanej z języka C:

if (wyrażenie) {
instrukcje;
}

Instrukcja if powoduje obliczenie wartości wyrażenia; jeśli jego wartością jest logiczna prawda, wykonywane są polecenia w nawiasach klamrowych. W przeciwnym przypadku nie są one wykonywane.

Opcjonalnie po instrukcji if podać można jedną lub więcej instrukcji elsif i jedną instrukcję else:

if (wyrazenie1) {
instrukcje;
} elsif (wyrazenie2) {
instrukcje;
} elsif (wyrazenie3) {
instrukcje;
} else {
instrukcje;
}

W tej formie najpierw obliczona zostanie wartość wyrażenia wyrazenie1; jeśli jest ono prawdziwe, wykonany zostanie pierwszy blok instrukcji. Jeśli wyrazenie1 nie jest prawdziwe, zostanie sprawdzona wartość wyrażenia wyrazenie2. Jeśli wyrazenie2 jest prawdziwe, zostaną wykonane instrukcje zapisane w drugim bloku. W przeciwnym przypadku zostanie sprawdzony warunek trzeci (wyrazenie3); jeśli jest on prawdziwy, zostanie wykonany trzeci blok instrukcji. Wreszcie jeśli żaden z warunków nie jest spełniony, zostanie wykonany blok instrukcji po słowie kluczowym else. W przypadku takiej „drabinki” pamiętać należy o tym, że wykonany zostanie tylko jeden z bloków instrukcji.

0x01 graphic

W języku Perl wyrażenie jest prawdziwe, jeśli ma wartość inną niż zero, i fałszywe w przeciwnym przypadku - czyli tak jak w języku C i dokładnie odwrotnie niż w programach użytkowych, takich jak np. test.

Poniższy przykład ilustruje zastosowanie instrukcji if:

print "Wprowadz imie lub wpisz \"pomoc\" aby uzyskac \n";
print "objasnienie dzialania programu \n";
$imie=<STDIN>;
chop($imie);
if ($imie eq "" ) {
print "Musisz wprowadzic imie\n";
exit;
} elsif ($imie eq "pomoc") {
print "Program wczytuje imie uzytkownika\n";
print "a nastepnie drukuje na ekranie krotkie pozdrowienie\n";
exit;
} else {
print "Witaj $imie, to wlasnie jest Perl";
}

Po uruchomieniu powyższy program wyświetli krótki komunikat i będzie oczekiwał na wprowadzenie jakiejś wartości. Wprowadzona wartość zostanie przypisana zmiennej $imie (trzeci wiersz programu). Instrukcja if przekazuje sterowanie do odpowiedniego bloku programu, w zależności od wprowadzonego tekstu. Jeśli wciśniesz Enter nie podając żadnego tekstu, zostanie wyświetlony komunikat Musisz wprowadzić imię. Jeżeli wprowadzisz tekst pomoc i wciśniesz Enter, wyświetlone zostanie objaśnienie dotyczące działania programu. W innych przypadkach wprowadzony tekst zostanie potraktowany jako imię i zostanie wyświetlony odpowiedni komunikat.

Polecenie chop usuwa ostatni znak zmiennej będącej jego argumentem. W powyższym programie jest ono potrzebne, ponieważ ostatnim znakiem wprowadzonej z klawiatury zmiennej jest symbol nowego wiersza. Gdybyśmy go nie usunęli, polecenie print wydrukowałby go, dając na wyjściu na przykład

Witaj Michal
, to wlasnie jest Perl

Instrukcja unless

Instrukcja unless jest przeciwieństwem instrukcji if. Oblicza wartość wyrażenia warunkowego, i jeśli jest ono fałszywe - wykonuje dany ciąg instrukcji. Jego składnia jest następująca:

unless (wyrazenie) {
instrukcje;
}

Oczywiście w każdym miejscu, gdzie można zastosować instrukcję unless, można równie dobrze użyć instrukcji if, negując warunek - funkcje obu tych instrukcji pokrywają się. Z tego powodu instrukcja unless jest używana dość rzadko. Poniżej podano przykład jej zastosowania:

print "Wprowadź numer rachunku\n";
$rach=<STDIN>
unless ($rach<1000) {
print "Jako klient uprzywilejowany otrzymujesz 10% zniżki";

}

Powyższy program pyta użytkownika o numer rachunku. Jeśli numer ten jest większy lub równy 1000, wypisywana jest informacja Jako klient uprzywilejowany otrzymujesz 10% zniżki.

Instrukcja for

Jak dotąd omówiliśmy tylko instrukcje warunkowe. Teraz omówimy instrukcję for, która jest jedną z instrukcji iteracyjnych dostępnych w języku Perl. Instrukcje iteracyjne służą do wykonywania bloków programu pewną liczbę razy. Składnia instrukcji for jest następująca:

for (wyrazenie_inicjalizujace; warunek; wyrażenie) {
instrukcje;
}

Zwykle w wyrażeniu wyrazenie_inicjalizujace następuje przypisanie wartości początkowej jakiejś zmiennej spełniającej funkcję licznika pętli. Wyrażenie to jest obliczane tylko raz, przed rozpoczęciem iteracji. Przed każdą iteracją obliczana jest wartość wyrażenia warunek. Pętla jest powtarzana, dopóki jest ono prawdziwe. Trzecie wyrażenie zwykle używane jest do zwiększania licznika pętli, ale może być wykorzystane również w inny sposób. Jest ono wykonywane po każdym przebiegu pętli. Poniżej podano przykład użycia tej instrukcji.

for ($i=0; $i<20; $i=$i+2) {
print $i*2, " ";
}
print "\n Koniec\n";

Powyższy program wyświetla w każdym przebiegu pętli wartość $i*2. Przed pierwszym jej wykonaniem zmiennej $i przypisywana jest wartość zero. Następnie wartość zmiennej $i porównywana jest z liczbą 20; ponieważ wartość $i jest mniejsza niż 20, wykonywane jest ciało pętli. Pierwszy przebieg pętli powoduje więc wyświetlenie liczby 0. Po każdym przebiegu pętli wartość zmiennej $i jest zwiększana o dwa. Pętla powtarzana jest do momentu, aż wartość $i jest większa lub równa 20 (warunek wykonania pętli przestaje być spełniony). Po zakończeniu pętli następuje przejście do następnych instrukcji. W wyniku działania tego programu otrzymamy więc:

0 4 8 12 16 20 24 32 36
Koniec

Pętle for są często używane do obsługi tablic o stałych rozmiarach. Poniższy program wyświetla wszystkie wartości zapisane w tablicy pięćdziesięcioelementowej:

for ($i=0; $i<50; $i=$i+1) {
print $tablica[$i], "\n";
}

W przypadku, gdy rozmiar tablicy nie jest znany (co często zdarza się w programach pisanych w języku Perl), bardziej przydatne są instrukcje foreach lub while.

Instrukcja foreach

foreach to kolejna instrukcja iteracyjna, podobna do instrukcji for znanej z języków powłok bash i pdksh oraz instrukcji foreach języka powłoki tcsh. Wykonuje ona blok instrukcji dla każdego elementu listy podanej jako jej drugi argument. Składnia instrukcji foreach jest następująca:

foreach $i (@lista) {
instrukcje;
}

W miejscu tablicy lista może również pojawić się bezpośrednio podana lista elementów. Oto przykład użycia instrukcji foreach:

@tab1=(5,10,15,20,25);
foreach $i (@tab1) {
print $i*3, " ";
}
print "\n";

Powyższy program wyświetla kolejno wszystkie wartości zapisane w tablicy tab1 pomnożone przez trzy, czyli

15 30 45 60 75

Ciekawa jest również możliwość przypisania wartości zmiennej $i wewnątrz pętli. Dzięki temu można np. zmienić wartość wszystkich elementów tablicy o nieznanym rozmiarze - w poniższym przykładzie pomnożono je przez trzy:

@tab1=(5,10,15,20,25);
foreach $i (@tab1) {
$i=$i*3;
}

Po wykonaniu powyższego kodu w tablicy tab1 znajdą się wartości (15,30,45,60,75).

Instrukcja while

Instrukcja while pozwala na wykonywanie bloku programu tak długo, jak długo zadane wyrażenie warunkowe jest prawdziwe. Składnia instrukcji while jest następująca:

while (wyrazenie) {
instrukcje;
}

Wyrażenie warunkowe obliczane jest przed każdym przebiegiem pętli; jeśli jest ono prawdziwe, wykonywane są instrukcje stanowiące ciało pętli. W przykładowym programie pętlę while zastosowano do wyświetlenia wszystkich elementów tablicy:

$i=0;
@tablica=(1,2,3,4,5);
while ($tablica[$i]) {
print $tablica[i];
$i=$i+1;
}

Pętla będzie powtarzana dopóty, dopóki wartość zmiennej $tablica[i] będzie zdefiniowana (czyli dla wszystkich elementów tablicy). Zauważ, że dzięki takiemu rozwiązaniu nie musisz wiedzieć, ile elementów znajduje się w tablicy.

Instrukcja until

Instrukcja until jest bardzo podobna do instrukcji while. Ciało pętli jest jednak wykonywane w przypadku, gdy wyrażenie warunkowe jest fałszywe. Każdą pętlę until można zastąpić pętlą while negując wyrażenie warunkowe, dlatego nie jest ona używana szczególnie często. Oto przykład zastosowania pętli until:

$i=0;
until ($i>10) {
print "$i ";
$i=$i+1;
}

Polecenia wewnątrz pętli wykonywane będą tak długo, aż wartość zmiennej $i przekroczy 10. Powyższy fragment programu jest równoważny następującemu:

$i=0;
while ($i<=10) {
print "$i";
$i=$i+1;
}

Po uruchomieniu dowolnego z powyższych przykładów na ekranie otrzymamy następujący wynik:

0 1 2 3 4 5 6 7 8 9 10

Funkcje

Poznałeś już kilka funkcji wewnętrznych języka Perl, takich jak na przykład funkcja print. Pora dowiedzieć się, w jaki sposób można tworzyć własne funkcje.

Składnia definicji funkcji (podprogramu) w języku Perl jest następująca:

sub nazwa_podprogramu {
instrukcje;
}

Instrukcje zawarte w podprogramie są wykonywane przy każdym jego wywołaniu.

Spójrzmy na przykładową definicję funkcji wyświetlającej iloczyn dwóch liczb będących wartościami zmiennych $num1 i $num2:

sub mult {
print "$num1 * $num2 =",$num1*$num2,"\n";
}

Aby wywołać funkcję, musisz poprzedzić jej nazwę symbolem &, tak jak w poniższym przykładzie:

$num1=5;
$num2=10;
&mult;

Po wywołaniu takiego programu na ekranie zostaną wyświetlone następujące dane:

5*10=50

Jednak funkcje nie potrafiące pobrać parametrów i zwrócić wartości nie są szczególnie przydatne.

Przekazywanie argumentów do funkcji

Przekazywanie argumentów do funkcji zwiększa w znacznym stopniu ich użyteczność, ponieważ przekazując jakieś dane jako argumenty nie trzeba znać nazw zmiennych używanych przez funkcję. Przepiszmy funkcję mult tak, aby działała nie na zmiennych globalnych (w poprzednim przykładzie operowała ona na zmiennych num1 i num2), ale pobierała dwa argumenty:

sub mult2 {
print "$_[0] * $_[1]=",$_[0]*$_[1],"\n";
}

Zmienne $_[0] i $_[1], będące elementami tablicy $_ (znak podkreślenia), zawierają właśnie dwa pierwsze argumenty wywołania funkcji. Wywołanie takiej funkcji może mieć następującą postać:

&mult2(5,10);

Efekty działania funkcji są takie same jak w poprzednim przykładzie:

5*10=50

Argumenty funkcji dostępne są w jej wnętrzu jako elementy tablicy o nazwie $_. Pierwszy z nich jest więc zapisany pod nazwą $_[0], drugi - $_[1], i tak dalej.

Zwracanie wartości

Jeśli nie chcesz, by wynik działania funkcji był wyświetlany na ekranie, tylko zwracany do programu, musisz umieć zmusić funkcję do zwrócenia określonej wartości. W języku Perl każda funkcja zwraca jakąś wartość. Domyślnie jest to wartość zwrócona przez ostatnio wykonaną operację. Tak więc w poprzednich przykładach funkcje zwracały to, co zostało zwrócone przez funkcję print (która zwraca wartość 1, jeśli wszystko przebiegło pomyślnie). Aby iloczyn dwóch liczb był zwracany do programu, funkcja powinna wyglądać tak:

sub mult3 {
$_[0]*$_[1];
}

Jej wywołanie w programie może mieć następującą postać:

$wynik=&mult3(2,3);

print "Wynikiem mnożenia jest $wynik";

Po wykonaniu takiego programu wynik mnożenia liczb 2 i 3 staje się wartością zmiennej $wynik, a następnie jest on wyświetlany na ekranie.

Operatory

W przykładach pojawiających się w tym rozdziale znalazło się całkiem sporo operatorów. Były nimi na przykład polecenia takie jak print, czy też służące do obsługi tablic asocjacyjnych, jak keys, values, each, delete itd. W języku Perl dostępna jest ogromna liczba innych operatorów. Aby zorientować się, jakiego typu operacje pozwalają one wykonać, albo obejrzeć ich pełny spis, przejrzyj dokumentację dostępną na stronach man.

Konwertowanie programów
do języka Perl

Perl ma podobne możliwości jak wiele innych języków programowania dostępnych dla Linuxa. Ponieważ jest on nadzbiorem języków sed i gawk, każdy program napisany w tych językach może być z łatwością przetłumaczony na język Perl. Służą do tego programy narzędziowe a2p (konwersja z języka gawk) i s2p (konwersja z języka sed).

0x01 graphic

Translator języka gawk na Perl nazywa się nie g2p, ale a2p, ponieważ gawk to wersja GNU języka awk.

Aby uruchomić program a2p (lub s2p), wydaj po prostu polecenie:

a2p program_gawk > program_perl

lub odpowiednio

s2p program_sed > program_perl

Polecenia te spowodują przetłumaczenie programu w języku gawk (lub sed) na Perl.

Podsumowanie

W tym rozdziale przedstawiliśmy w skrócie podstawowe reguły programowania w języku Perl. Jest to chyba najpotężniejszy z języków dostępnych dla systemu Linux. Zawiera operatory pozwalające zrobić wszystko to, na co pozwala system operacyjny. Ogromna liczba dostępnych funkcji powoduje, że aby zostać ekspertem potrzebnych jest co najmniej kilka miesięcy intensywnej praktyki, ale nauczenie się go w podstawowym zakresie jest bardzo łatwe.

Choć w rozdziale tym poruszyliśmy najważniejsze koncepcje języka Perl, nawet nie zasygnalizowaliśmy ogromnej liczby jego zastosowań. Pewne pojęcie o potędze tego języka może dać dokumentacja dostępna w postaci stron man.

awk, język przeznaczony do obsługi plików tekstowych, opisany jest w rozdziale 25. „gawk”.

Tcl i Tk, języki programowania przydatne głównie do pisania niewielkich skryptów, działających również w środowisku X, omówione są w rozdziale 29. „Podstawy języków Tcl i Tk”.

Tworzenie skryptów CGI, obecnie chyba najważniejsze z zastosowań języka Perl, przedstawione jest w rozdziale 52. „Skrypty CGI”.

478 Część V Linux dla programistów

478 E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\28.DOC

E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\28.DOC 463

Rozdział 28. Perl 479



Wyszukiwarka

Podobne podstrony:
43, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
34, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
58, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
26, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
08, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
10, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
57, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
29, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
46, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
60, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
36, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
49, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
62, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
D, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
55, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
61, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
42, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
03, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta
31, ciekawostki, Linux - Ksiega Eksperta, Linux - ksiega eksperta, Linux - księga eksperta

więcej podobnych podstron