PERL Practical Extraction and Report Language Autor - Larry Wall. Jest to interpretowany język programowania, do przeszukiwania i wydobywania informacji z plików tekstowych i do generowania raportów na podstawie zebranych danych. Posiada wiele cech innych języków, m. in. języka C. Jest idealnym językiem do tworzenia skryptów CGI. Skrypty Perla są niezależnie od platformy użytej do jego wykonania. Mimo nieznacznych różnic, przeniesienie kodu z jednej platformy na inną odbywa się bez jakichkolwiek modyfikacji. Wszystkie zadania, jakie realizowane są w C, można by wykonać w Perlu. Pozwala on konstruować skomplikowane struktury danych i programować w stylu obiektowym. Pożyteczne linki: Strona główna: http://www.perl.com/ Kurs Perla 5: http://wieluk.republika.pl/index.html FAQ: http://www.kt.agh.edu.pl/other/perl/faq/ Instalki:http://www.activestate.com/ASPN/Downloads/ActivePerl/ CPAN (Comprehensive Perl Archive Network) źródło dokumentacji oraz modułów do języka Perl. (umożliwiają dostęp do baz danych czy protokołów komunikacyjnych, tworzenie obrazków, wykonywanie skomplikowanych operacji matematycznych). Wszystkie moduły są darmowe; większość z nich została udostępniona na licencji Artystycznej lub GNU GPL http://www.cpan.org/ Pisanie i uruchomienie skryptu: Skrypt piszemy w edytorze tekstu wykonanie: perl nazwaskryptu możemy też podać interpreter: pierwsza linia skryptu musi mieć postać:, a sam skrypt musi mieć atrybut wykonywalności W Windows skrypt powinien mieć rozszerzenie.pl Zmienne skalarne: $a=5 #całkowita $b=5.25 #ułamek $c=5e-4 #wykładnicza (5*10-4 ) $d=012 #ósemkowa $e=0xff #szesnastkowa $f='h=$a' #łańcuch bez interpretacji $g="h=$a" #łańcuch z interpretacją Wartość $f:h=$a ; $g:h=5 Operatory arytmetyczne: + dodawanie 2+3 =5 - odejmowanie 5-3 =2 * mnożenie 3*4 =12 / dzielenie 25/2 =12.5 ** potęgowanie 5**3 =125 % modulo (reszta z dzielenia) 15%4 =3 Priorytet: **, *, /, %, +, - Operatory relacji: == lub eq równy!= lub ne nierówny < lub lt mniejszy > lub gt większy <= lub le mniejszy lub równy >= lub ge większy lub równy Operatory logiczne: && - and - or! - not 1
Wszystkie zmienne skalarne za wyjątkiem: "" (łańcucha pustego) 0 (zera) wartości niezdefiniowanej mają wartość logiczną true Operatory przypisania: += $a+=3 $a=$a+3 -= $b-=5 $b=$b-5 *= $c*=7 $c=$c*7 /= $d/=2 $d=$d/2 **= $e**=3 $e=$e**3 %= $f%=10 $f=$f%10 Inkrementacja i dekrementacja ++$a zwiększ o 1 po czym zwróć wartość $a++ zwróć wartość po czym zwiększ o 1 --$a, $a-- j.w, ale zmniejsz o 1 Łączenie łańcuchów:. - operator łączenia łańcuchów x - operator powtarzania łańcucha $a='ala'; $b='kota'; $c=$a. ' ma '. $b; # $c='ala ma kota' $c=$a x 4; #$c='alaalaalaala' Wejście/wyjście Wczytanie z klawiatury: $a= <STDIN>; z usunięciem \n: chomp ($a=<stdin>); Wydruk na ekranie: print $a; Przykłady print "Licznik: "; chomp($a = <STDIN>); print "Mianownik: "; chomp($b = <STDIN>); $c = $a / $b; print "Ulamek to $c\n"; $c*=100; print "Procent to $c\n"; print "Napis: "; $a = <STDIN>; print "Ile razy powtorzyc: "; chomp($b = <STDIN>); $c = $a x $b; print "Nowy napis:\n$c"; Tablice zwykłe @liczbowa=(2, 5, 7, 23); @tekstowa=('ala', 'ma', 'kota'); @mieszana=(2.18, 'ala', $a, 2+2); dostęp do elementu tablicy przez jej nazwę i indeks (od 0) $tekstowa[0] (='ala') $tekstowa[2] (='kota') zmiana elementu: $tekstowa[2]='psa'; dopisanie elementu: $tekstowa[3]='burka'; Tablica @ARGV zawiera argumenty skryptu (ale bez jego nazwy) Nazwa skryptu - $0 Tablice rozproszone %tablica=(klucz, wartość,klucz,wartość,klucz,wartość..); lub %tablica=(klucz=>wartość,klucz=>wartość...) przykład: oceny z egzaminu %oceny=('kowalski'=>3.5,'nowak'=>4,'cias'=>5); Odwołanie do elementu: $oceny{'kowalski' =3.5 Dopisanie elementu: $oceny{'batko'=2; Skreślenie elementu delete $oceny{'batko'; 2
if (wyrazenie1) { instrukcje1; elsif (wyrazenie2) { instrukcje2;... else { instrukcje_n; Warunki Wyrażenia muszą zwracać prawdę lub fałsz Zapis skrócony: wyrazenie? instr_prawdy : instr_fałszu; while (wyrazenie) { #wykonywana tak długo, jak długo wyrażenie jest true until (wyrazenie) { #wykonywana tak długo, jak długo wyrażenie jest false : do { while (wyrazenie) lub do { until (wyrazenie) muszą się wykonać co najmniej raz for (początkowy; wyrazenie; zmiana_indeksu) { np. for ($i = 1; $i < 10; $i++) { print $i; foreach $zmienna (@tablica) { #dla tablicy zwykłej foreach $zmienna (keys %tablica_rozpr) { #dla tablicy rozproszonej, za zmienną podstawia klucze foreach $zmienna (1..9) { #podstawia za zmienną 1,2,3,4...9 foreach $zmienna ('ala', 5, $a) { #podstawia za zmienną kolejno to co na liście Modyfikacja przebiegu pętli: last wychodzi z pętli i wykonuje następne instrukcje next przerywa bieżący cykl i przechodzi na początek pętli redo powtarza bieżący cykl pętli (nie sprawdza warunki i nie modyfikuje licznika Przykłady print "Jaka temperatura? "; chomp($temperatura = <STDIN>); if ($temperatura > 0) { print "Dodatnia\n"; elsif ($temperatura < 0) { print "Ujemna\n"; else { print "Zero\n"; print "Wprowadz pierwsza liczbe. 999 konczy wprowadzanie: "; chomp($a = <STDIN>); $i=0; while ($a!= 999) { $suma += $a; $i++ ; print "Wprowadz kolejna liczbe 999 oznacza koniec: "; chomp($a = <STDIN>); $s=$suma/$i; print "Srednia tych liczb wynosi $s\n"; Operacje na tablicach Fragment tablicy: @tydzien = ('poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota', 'niedziela'); @weekend = @tydzien[5, 6]; @robocze = @tydzien [0..4]; Dla tablic rozproszonych: %fragment = %tablica{'klucz1', 'klucz3', 'klucz6'; Sortowanie tablic zwykłe według wartości (ASCII lub numerycznie) rozproszone według klucza (sortuje klucze) 3
Przykład print "Wprowadz liste nazwisk, na koniec ^D:\n"; @lista = <STDIN>; @posortowana= sort @lista; @odwrocona = reverse @posortowana; print "Posortowane rosnaco:\n"; print @posortowana ; print "Posortowane malejaco:\n"; print @odwrocona ; Operacje na tablicach/listach Przeszukiwanie: $dzien = 'poniedziałek'; $szuk = 'dzia'; $pozycja = index $dzien, $szuk; # (= 5) szukanie bez powodzenia zwraca wartość ujemną Modyfikowanie elementów listy push: dodaje element (listę) na koniec listy; pop: usuwa element z końca listy; unshift: dodaje element (listę) na początek listy; shift: usuwa element z początku listy; splice: dodaje lub usuwa dowolny element listy. Operacje na tablicach/listach Modyfikowanie elementów listy, cd reverse: odwraca kolejność elementów listy; split: rozdziela łańcuch na elementy listy; @nowa=split /;/, $lancuch; (dzieli przy średnikach) join: skleja elementy listy w łańcuch map: wykonuje takie same działania na wszystkich elementach listy index, rindex znajdowanie podłańcuchów substr: wycina fragment łańcucha (pozycja, długość). Porównanie wzorców $lancuch = 'wzorzec'; $lancuch =~ m/wzorzec/ zwraca true, gdy w łańcuchu występuje wzorzec, np. if ($lancuch =~ m/wzor/){ print "jest\n"; else { print "nie ma\n"; /^wzor/ #początek wiersza /wzor$/ #koniec wiersza /wzor\b/ #koniec słowa /\bnie\b/ #tylko całe słowo nie /^Ala ^Ola/ /^(Ala Ola)/ #Ala lub Ola na początku wiersza Klasy znaków /[ab]/ # /a/ lub /b/ /[a-d]/ # Odpowiada /[abcd]/ /[a-d1-5]/ # /[abcd12345]/ /[^ab]/ # wszystko za wyjątkiem a i b \d [0-9] #tylko cyfry \D [^0-9] #nie cyfry \w [0-9A-Za-z] #znaki słowa \W [^ 0-9A-Za-z] #nie znaki słowa \s [' '\t\n\r\f] #znaki "białe" (spacja, nowa linia,nowa strona, tabulator) \S [^' '\t\n\r\f] #wszystko poza znakami białymi np. /\d\d\d\d/ #prawda, gdy cztery cyfry znak? znak* znak+ Dopasowywanie znaków wielokrotnych znak musi wystąpić 0 lub 1 raz znak musi wystąpić 0 lub 1..n razy znak musi wystąpić co najmniej 1 raz /zm\w?/ #dopasowuje zm, zm1, zm2, zma, zmb /zm\d*/ #dopasowuje zm, zm1, zm11, zm12345 /zm\d+/ #dopasowuje zm1,zm999, ale nie zm /zm\d{2,5#pasujące to zm z 2 do 5 cyframi 4
Procedury sub nazwa { Wywołanie: &nazwaproc(); Przekazanie danych do procedury: &nazwaproc ($arg1,$arg2,$arg3...); Wewnątrz procedury widziane jako składniki tablicy @_ $_[0],$_[1],... Zwracanie wartości: sub suma {... return $a+$b; #wywołanie w głównym: $sum=&suma; Wejście, wyjście, pliki $lancuch=<stdin>; cała linia z wejścia podstawiona za zmienną lancuch @tablica=<stdin>; wszystkie wiersze z wejścia jako elementy tablicy print $zmienna; zmienna drukowana na standardowym wyjściu open (plik,"sciezka/nazwa"); #do odczytu open (plik,">sciezka/nazwa"); #do zapisu open (plik,">>sciezka/nazwa"); #do dopisania open (plik, "plik.txt") die "Nie można otworzyć pliku"; #die - w przypadku błędu $lancuch = <PLIK>; print plik, $zmienna; close plik; 5