Dátové typy

Porovnanie :: PHP | Python

Na rozdiel od niektorých programovacích jazykov má Perl relatívne malý počet dátových typov. Implementuje tri základné dátové typy - skalár, pole skalárov a hashe skalárov(asociatívne pole). V Perli sa vyskytujú aj špeciálne dátové typy ako typeglob a podprogramy.

Typ Znak Príklad Označenie pre...
Skalár $ $meno_skalára Jednotlivá hodnota (číslo, reťazec)
Pole @ @meno_poľa Pole hodnôt indexovaných číselne
Hash % %meno_hashu Pole hodnôt indexovaných reťazcom
Podprogram & &meno_podprogramu Voliteľný úsek programu v Perle
Typeglob * *meno_typeglob Čokoľvek pomenované ako meno_typeglob

Skalár

Skalár je základný dátový typ a tvoria sa z neho ostatné, zložitejšie dátové typy. Skalár obsahuje vždy práve jednu hodnotu, ktorou je reťazec, číslo alebo odkaz na iné údaje. Perl nerozlišuje či v premennej je číslo, reťazec, prípadne celé alebo desatinné číslo. To znamená, že v jednom okamihu je možné s takouto premennou zaobchádzať ako s číslom a inokedy ako s reťazcom.

Niekoľko príkladov obsahu skalárnej premennej:

$odpoved = 42; # celé číslo
$pi = 3.141592654; # reálne číslo
$projekt = "LAMP technológia"; # reťazec
$veta = "Náš projekt je $projekt"; # reťazec s vložením
$x = $foo * $bar; # výraz

Za normálnych podmienok nie je nutné explicitne deklarovať premenné. Na deklaráciu sa používa príkaz my. Syntax potom vyzerá takto:

my $foo; # deklarácie jednej premennej bez priradenia
my ($odpoved,$otazka); # deklarácia viacerých premenných
my $bar='LAMP'; # deklarácie jednej premennej s priradením

Pole

Pole je definované ako zoznam skalárnych hodnôt, ktoré sú radené za sebou. Týmto skalárnym hodnotám v poli hovoríme prvky. Prvok je určený indexom a obsahuje hodnotu. Index je číslo. 1. indexom je nula, dalším 1 atď. Pole označujeme znakom @. Ale na označenie jednotlivých prvkov poľa používame znak $

Dĺžka poľa je daná počtom prvkov v poli.

@zoznam = ('rum','cola','lad','pohar'); # exaktne definované pole naplnené skalármi
($alkohol,$nealko,$lad,$vec) = @zoznam; # pole priradené do iného poľa skalárnych premenných
($foo,$bar) = ($bar,$foo); # výmena hodnôt medzi dvoma poľami

Operácie s poľom

Pole vytvoríme rovnako ako skalárnu premennú - priradením. Ľavý operand je identifikátor, ktorý začína zavináčom a na pravo su uvedené v okrúhlych zátvorkách hodnoty jednotlivých prvkov, oddelené čiarkami.

@pole = ("prva_hodnota", "druha_hodnota", "tertia_hodnota");

Takto sme vytvorili trojprvkové pole. Nasledujúca tabuľka nám určuje jeho štruktúru:

Index Hodnota
0 prva_hodnota
1 druha_hodnota
2 tretia_hodnota

Ak chceme získať hodnotu prvku @pole s indexom x, zápis je následujúci:

$pole[x]

Tu si ale musíme dať pozor, prvok pole je skalárom a označuje sa dolárom $. Nasledujúcim spôsobom získame prvky z poľa @pole.

print "Prvok 0: $pole[0]\n";
print "Prvok 1: $pole[1]\n";
print "Prvok 2: $pole[2]\n";

Výpis predchádzajúceho príkladu

Prvok 0: prva_hodnota
Prvok 1: druha_hodnota
Prvok 2: tretia_hodnota

Funkcie pre prácu s poľom

Pre prácu s poliami sú v Perli preddefinované rôzne funkcie. Pomocou funkcie push je možné na koniec daného poľa pridať zadaný zoznam prvkov. Funkcia unshift pridáva prvky na začiatok daného poľa. Dĺžka poľa sa o daný počet prvkov zvýši a je vrátená ako návratová hodnota týchto funkcií.

@pole = (1, 2, 3);
print push @pole, 10; # vypíše hodnotu 4, @pole obsahuje prvky 1, 2, 3, 10

print unshift @pole, 20; # vypíše hodnotu 5, @pole obsahuje prvky 20, 1, 2, 3, 10

Pre odobratie jedného prvku z poľa slúžia funkcie pop a shift. Pop odoberie a vráti prvok z konca poľa, shift odoberie a vráti prvok poľa zo začiatku. V obidvoch prípadoch sa dĺžka poľa zkráti o jeden prvok.

@pole = (1, 2, 3, 4, 5);
print pop @pole, 10; # vypíše hodnotu 5, @pole obsahuje prvky 1, 2, 3, 4

print shift @pole, 20; # vypíše hodnotu 1, @pole obsahuje prvky 2, 3, 4

Vďaka týmto funkciám a vlastnostiam polí v Perli môžeme implementovať dátové štruktúry front a zásobník. Dvojice funkcií push a pop alebo unshift a shift slúžia pre prácu s poľom ako so zásobníkom. Dvojice funkcií push a shift alebo unshift a pop umožňujú s poľom pracovať ako s frontom.

Funkcia splice pracuje s viacerými prvkami poľa naraz a tieto prvky sa nemusia nachádzať na začiatku alebo na konci daného poľa. Funkcia zo zadaného poľa vezme zadaný počet prvkov na zadanej pozícii a nahradí ich zadaným zoznamom hodnôt. Ak hodnoty udávajúce počet prvkov, ktoré sa majú nahradiť, alebo počet prvkov, ktoré sa majú vložiť, sú nulové, tak v tom prípade dochádza len ku vloženiu resp. odobratiu prvkov z poľa.

@pole = (1, 2, 3, 4, 5);
splice @pole, 2, 2, 'a', 'b', 'c'; # z pole @pole odoberieme 2 prvky (3. s 4.) od indexu 2 a vložíme hodnoty a, b, c
1, 2, a, b, c, 5; # obsah poľa @pole

splice @pole, 3, 1; # z pole @pole odoberieme od indexu 3 jeden prvok ('b') a ničím nenahradzujeme
1, 2, a, c, 5; # obsah poľa @pole

splice @pole, 1, 0, 'x', 'y'; // z pole @pole od indexu 1 odstránime 0 prvkov a vložíme prvky x a y
1, x, y, 2, a, c, 5; # obsah poľa @pole

Usporiadanie prvkov poľa podľa abecedy je v jazyku Perl veľmi jednoduché. Funkcia sort uspriadáva(implicitne) prvky podľa ASCII tabuľky. Funkcia reverse obracia poradie prvkov poľa. Posledný prvok prehodí s prvým, predposledný s druhým atď.

@p = qw(a g d f e b c); # neusporiadaný zoznam
print @p; # výpis poľa @p: agdfebc
@p = sort @p; # použitie funkcie sort
print @p; # výpis po použití funkcie sort: abcdefg
@p = reverse @p; # použitie funkcie reverse
print @p; # výpis po použití funkcie reverse: gfedcba

Takýto systém porovnávania porovnáva znak po znaku, zľava doprava, takže 6 je väčšie ako 44. Z tohto hľadiska sa tento zápis nedá použiť na čísla.

Hash

Hash je plne asociatívny zoznam, kedy pomocou jedného skaláru (identifikátora) môžeme pristupovať k položke zoznamu.

Príklad zápisu:

%menoDna =< (
   'Po' => 'Pondelok';
   'Ut' => 'Utorok';
   'Str' => 'Streda';
   'Stv' => 'Stvrtok';
   )

Tento uvedený spôsob sa v praxi viac využíva z dôvodu, že je prehľadnejší. Využíva znamienko =>, kedy pred znamienko sa dáva kľúč a za znamienko sa dáva hodnota.

Na získanie hodnoty z hash využívame $, lebo návratová hodnota je skalárna:

$menoDna{'Po'} # vráti hodnotu Pondelok