03 - Premenne v Perle

V predchadzajucej casti som uviedol par veci tykajucich sa literalov - faktov, ktore sa nemenia za behu programu. Vacsinou vsak asi kazdy bude potrebovat udaje za behu programu menit - a prave na to je vhodne pouzit premenne :) Perl pozna tri zakladne typy premennych, ktore sa lisia svojim spravanim a obsahom, ktory im moze byt priradeny :
ZAUJIMAVOST: V Perle sa jednoduche premenne nikdy nedeklaruju, nedefinuju ani nealocuju. Vzdy pri prvom objaveni sa premennej v kode programu jej Perl priradi nulu (ak cakame cislo) alebo prazdny retazec (ak sa ocakava retazec). Pouzitie mena premennej je vlastne ekvivalentne jej definovaniu.

Skalarne premenne

Skalarna premenna sama o sebe nie je velmi zaujimava a narocna. Zlozitejsie veci sa objavia az pri jej pouziti v dvojitych uvodzovkach - teda pri vypise retazcov.
Priklad (meno premennej):
        $pocetIzieb
        $premenna
Priklad (priradenie a pouzitie hodnoty premennej)::
        $pocetIzieb = 20;
        $pocetIzieb = $pocetIzieb + 5;
        $premenna = "s priradenym textom";

Polia

Polia pouziva Perl na ulozenie zoznamov. Moze sa do nich ulozit uplne vsetko - nezalezi ako skombinujeme jeho prvky, je jedno akeho su typu.

Definovanie pola

@pole; <---pole, ktoreho hodnota zatial nebola definovana
( ); <--- prazdne pole
@cisla = (12, 014, 0x0c, 34.34, 23.3E-3);
@retazce = ("toto","je","pole","stringov");
@mix = ("cervena",67,"jablko",8,0,"pocitac");
@pismena = ("A".."Z"); <--- obsahuje vsetky pismena od "A" po "Z"

Upozornenie: Pouzitie poli s obsahom ( ( 1 , 2 , 3 , 4 ) , ( 5 , 6 , 7 , 8 ) ) a ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ) je uplne ekvivalentne.
Perl vlozi prvky vnoreneho pola do hlavneho !

Praca s prvkami pola

Zadefinujme si jednoduche pole, ktore bude ako jednotlive polozky obsahovat mena mojich spolubyvajucich:
@spolubyvajuci = qw (Miso,Lubos,Marjan);         #   qw uzavrie kazdy prvok zoznamu do uvodzoviek
$spolubyvajuci[0];        # ukazuje v mojom zozname na polozku Miso
$spolubyvajuci[1];        # ukazuje v mojom zozname na polozku Lubos
$spolubyvajuci[2];        # ukazuje v mojom zozname na polozku Mrajan
$spolubyvajuci[3] = "Lubo";        # prida do zoznamu noveho spolubyvajuceho

Upozornenie: Aj ked sa meno pola musi vzdy zacinat znakom @ , pri jednotlivych prvkoch sa pouziva na zaciatku znak $ !

Upozornenie: V Perle je mozne pouzit vramci pola aj negativne indexy. Zapis $spolubyvajuci[-1]; je teda korektny a nevrati chybu! ( Pri indexovani je pouzita funkcia modulo. )

Upozornenie: Index pola zacina vzdy od cisla 0 . Da sa to zmenit pomocou specialnej premennej $[. Ak do nej priradim cislo 5, tak index pola bude zacinat od cisla 5.

Zistenie poctu prvkov pola

V Perle sa spravanie jednotlivych prvkov jazyka lisi od kontextu v akom je dany prvok pouzity. Je to tak aj pri poliach. Tato vlastnost sa specificky vyuziva na zistenie poctu prvkov pola. (Vzdy ked je pole pouzite v skalarnom kontexte, tak je vratena velkost a nie zoznam prvkov.)
@pole = (11,22,13,47,55,69);
$pocetPrvkov = @pole;        # $pocetPrvkov obsahuje odteraz cislo 6

Vypis prvkov pola

@pole = (1..5);
print @pole;

Tento maly kusok kodu vypise na vystup 12345  , neobjavia sa tam ziadne medzery ani ine oddelovace jednotlivyvh prvkov. Ak chceme jednotlive prvky oddelit musieme to urobit nasledovne:
print "@pole\n";
Vo vystupe sa po tomto prikaze objavia znaky 1  2  3  4  5  oddelene medzerou. Ak chceme pouzit iny znak na oddelenie prvkov, musime pouzit specialnu premennu $".
$" = ",";
print "@pole\n";
       # vypise 1,2,3,4,5

Tak a este zostala jedna dolezita vec suvisiaca s dvojitymi uvodzovkami. Predstavme si, ze mame premennu obsahujucu moje meno a ze sa ju pokusim vypisat v nasledovnom tvare:
$meno = "Lubo";
print "To je $menov pocitac";

Vystup bude To je pocitac. Perl sa totiz pokusi najst premennu $menov, co zrejme nie je moj umysel - chcel som totiz vypisat "To je Lubov pocitac". Takze ako na to? Su dve zakladne moznosti:

Asociativne polia (HASH)

Tak a konecne nadisiel cas spomenut nieco o skvelom nastroji, ktory nam ponuka Perl. Su nim asociatine polia. Ich definovanie a praca s nimi sa velmi nelisi od obycajnych poli. Maju vsak oproti nim jednu velku vyhodu - mozu pouzit akykolvek skalarny datovy typ ako index. Toto je aj hlavny rozdiel v ktorom sa lisia - kazda hodnota v asociativnom poli musi mat priradeny svoj index.

%asociativnePole = ("Fero","Dec 2","Jozo","jun 4","Peto","Feb 15");       # vytvorenie pola s 3 prvkami - klucom je meno a hodnotou je datum
$asociativnePole{"Lubo"} = "Nov 27";       # pridanie dalsieho prvku do pola

Vypis prvku asociativneho pola nie je celkom trivialny - v retazci uzavretom v dvojitych uvodzovkach totiz maju kucerave zatvorky specialny vyznam. Tu nam pomoze jedine operator konkatenacie stringov - oznacuje sa ako obycajna bodka.
print "Fero sa narodil: "  .  $asociativnePole{"Fero"}  .  "n\";