Zmienne w Perlu

Zmienne pozwalają przechowywać potrzebne programowi dane. Każda zmienna ma swoją nazwę, dzięki czemu możemy łatwo się do niej odnosić. W Perlu użycie zmiennych wygląda następująco:

$liczba = 5; print $liczba;

Uruchomiony program wypisze na ekranie:

5

Nazwa każdej zmiennej w Perlu musi być poprzedzona znakiem zaznaczającym jej typ. W przeciwieństwie do tzw. języków programowania o silnej typizacji dla Perla nie ma większego znaczenia, czy zmienna jest napisem, liczbą całkowitą czy ułamkiem. Rodzaje zmiennych są zupełnie inne.

W przykładzie możemy poznać, że $liczba to zmienna skalarna, gdyż jej nazwę poprzedza znak dolara.

Spróbuj Poeksperymentuj z przykładowym programem, podstawiając pod zmienną $liczba różne wartości (liczby, napisy itp.). Jak myślisz, co się stanie, gdy przed instrukcję print wstawimy linijkę $liczba = $liczba + 10?

Jeśli masz doświadczenie z tradycyjnymi językami programowania, zapewne zastanawiasz się, w jaki sposób w Perlu tworzy się zmienne.

Fakt ten może być szokujący dla programistów, którzy mieli wcześniej doświadczenie z językami typu C czy Pascal, które ściśle przestrzegają wymogu zadeklarowania zmiennej przed jej użyciem. Perl jest językiem interpretowanym i jego interpreter sam zarządza pamięcią, w której działa program. W przeciwieństwie do języków kompilowanych, Perl nie jest zdezorientowany, gdy napotyka zmienną, o której do tej pory nie wiedział - w takim wypadku po prostu ją tworzy.

Wymuszenie deklarowania zmiennych Takie działanie może być potencjalną przyczyną błędów. Załóżmy, że w naszym programie popełniliśmy literówkę:

$liczba = 5; print $licba + 10;

W efekcie nasz program wydrukuje:

10

Nie tego oczekiwaliśmy, prawda? Przyczyną tego zachowania jest nasz błąd w pisowni nazwy zmiennej - kompilator nie znalazł zmiennej $licba więc stworzył nową, o wartości zero. Wymóg deklarowania zmiennych w językach kompilowanych typu C ma tę zaletę, że informuje o błędzie przy tego typu pomyłkach. W Perlu wygoda używania zmiennych może też być pułapką w przypadku większych programów. Możemy się jednak z tym uporać. Dodanie do programu linijki:

use strict 'vars';

Linijka ta mówi interpreterowi Perla, by odmawiał korzystania ze zmiennych, które nie były zadeklarowane. Po użyciu tej dyrektywy będziemy musieli w całym programie deklarować zmienne. Można to robić używając polecenia my:

my $liczba = 5;

Domyślnie zmienne w Perlu są globalne. my powoduje, że zmienna staje się lokalna. Więcej na ten temat wyjaśnione jest w następnych rozdziałach.

Zwykłe zmienne

Zmienne skalarne określa się poprzez użycie $, mogą zawierać prawie dowolne typy danych. Na przykład:

$zmienna = 3; # liczby całkowite $zmienna = 3.1415926; # zmiennoprzecinkowe $zmienna = 3.402823669209384634633e+38; # liczby w zapisie wykładniczym $zmienna = $inna_zmienna + 1; # wyliczane $zmienna = 'Moge zawierac tekst'; # tekstowe $zmienna = \$OdwolanieDoInnejZmiennej; # referencje - odwołujące się do innej zmiennej $zmienna = \@OdwolanieDoTablicy; # referencje do tablic - odwołujące się do tablic

Wartość każdej z tych zmiennych wypiszemy poleceniem:

print $zmienna;

Tablice

Tablice dla odróżnienia od innych zmiennych oznacza się znakiem @.

@tablica = (1,2,3,4,5,6,7,8,9,10); # tablica liczb @tablica = (1..10); # zakres @tablica = qw/1 2 3 4 5 6 7 8 9 10/; # inny sposób @tablica = split(/,/, "1,2,3,4,5,6,7,8,9,10"); # tablica powstała z dzielenia napisu @tablica = qw/czerwony niebieski zielony/; # lista napisów @tablica = qw/czerwony niebieski 1 zielony 5/; # tablica mieszanego typu @tablica = qw/\@tablica1 \@tablica2 \@tablica3/; # tablica tablic

Poniższy fragment kodu wypisze wartości dowolnej z poprzednich tablic:

foreach $element (@tablica) { print "Nastepnym elementem jest $element\n"

W przypadku gdy działasz na pojedynczym elemencie tablicy (posługując się nawiasami kwadratowymi, aby uniknąć zamieszania), element ten jest uznawany za skalar i poprzedza się go znakiem $ tak jak przy innych zmiennych skalarnych.

$tablica = 1;

Pierwszy element w tablicy ma numer 0 (chociaż to, jak i wiele innych rzeczy w Perlu może być zmienione). Jako indeks (numer elementu) tablicy może być użyta wartość zmiennej:

$tablica[$numer] = 1;

Tablice asocjacyjne

Tablice asocjacyjne (ang. associative arrays) nazywane w Perlu haszami (ang. hash) są oznaczane znakiem %. Hasz przechowuje pary klucz-wartość (ang. key-value), gdzie klucz i wartość mogą być zmiennymi dowolnego typu. Hasze możemy traktować jako tablice, które nie są numerowane, tylko jako indeksu używa się np. łańcuchów znakowych.

%hasz = ('klucz1' => 'wartosc1', 'klucz2' => 'wartosc2'); # klucz i wartość zwyczajowo rozdzielamy strzałką %hasz = ('jeden', 1, 'dziesiec', 10, 'sto', 100); # ale można to tez robić przecinkiem

Jeśli używamy strzałki => lewa strona powinna być umieszczona w cudzysłowach. Dla długich list jest dobrze umieszczać kolejne pary w osobnych liniach:

%hasz = ( 'klucz1' => 'wartosc1', 'klucz2' => 'wartosc2', 'klucz3' => 'wartosc3', );

Do pojedynczego elementu odnosimy się używając nawiasów klamrowych, element ten jest wtedy uznawany za skalar i przyjmuje identyfikator $:

$hasz{'klucz1'} = 'wartosc1';

print $hasz{'klucz1'};

Podprogramy

Podprogramy są zdefiniowane przez słowo kluczowe sub i mogą być wywoływane używając &, chociaż nie jest to zalecane. Poniższy podprogram liczy wartości ciągu Fibonacciego:

sub fib { my $n = shift; return $n if $n < 2; return fib( $n - 1 ) + fib( $n - 2 );

print fib(14);