Datové typy

Na rozdíl od některých programovacích jazyků má Perl relativně malý počet datových typů. Není také možné vytvářet nové abstraktní datové typy jako například v Pascalu. Neznamená to však, že není možné takové věci provést jiným způsobem. Tímto způsobem je použití objektově orientovaného přístupu. I tak se ale v podstatě nejedná o vytvoření nového typu, ale o použití několika málo běžně používaných mechanismů.

Datové typy se vztahují jak k literálovým hodnotám, tak i ke konstantám a proměnným. Často je možné hodnoty různých typů zaměňovat bez toho, že by překladač hlásil chybu, jak je tomu v přísně typovaných programovacích jazycích.

Proměnné

Perl má tři základní tři základní datové typy -- skaláry, pole skalárů a hashe skalárů (asociativní pole).

Skaláry jsou základním typem a tvoří se z nich ostatní, složitější datové typy. Uchovávají jedinou hodnotu, kterou je řetězec, číslo nebo odkaz. Pole je uspořádaný seznam skalárů, k jednotlivým hodnotám se přistupuje pomocí číselného indexu (indexy začínají od 0). Hash je neuspořádaná množina dvojic klíč -- hodnota. K hodnotám se zde přistupuje pomocí řetězcových hodnot.

Identifikátor proměnné každého typu je uvozen zvláštním znakem. Skalární proměnné začínají znakem $ (připomíná S jako scalar), seznamy začínají znakem @ (připomíná a jako array) a hashe začínají znakem % (připomíná H jako hash). Každý typ proměnné má svůj vlastní jmenný prostor. To znamená, že pro skalární proměnnou je možné použít stejné jméno jako pro proměnnou typu pole nebo hash. Tato jména se pak budou lišit pouze prvním znakem. Jména i hodnoty proměnných jsou ukládána ve dvou typech paměťových struktur. Ty se nazývají tabulky symbolů a lexikální prostory. Tabulky symbolů jsou vztaženy vždy k určitému balíku, lexikální prostory se vztahují k bloku a nemají s tabulkami symbolů nic společného. Více prostoru je tabulkám symbolů věnováno v kapitole o balících.

Díky tomu, že jména proměnných začínají speciálním znakem, nemůže se stát, že by se pletla s rezervovanými slovy, jak tomu může být v jiných programovacích jazycích. Tetno problém ale může nastat např. u jmen podprogramů.

Jméno proměnné nemusí být vždy známo v době překladu, ale může být určeno až za běhu programu. Toho lze docílit tak, že místo jména proměnné lze použít blok vracející řetězec nebo odkaz.

${'x'} = 1;         # pracuje se s proměnnou $x

sub jmeno { return 'y'};
${ jmeno() } = 2;   # pracuje se s proměnnou $y

$rx = \$x;          # odkaz na proměnnou $x
${ $rx } = 123;     # pracuje se s proměnnou $x

Skalární hodnoty

Skaláry obsahují vždy jedinou hodnotu, kterou je řetězec, číslo nebo odkaz na jiná data. Reprezentuje tedy všechny celočíselné typy, typy pracující v pevné i pohyblivé řádové čárce, typy znakové i řetězcové.

logické hodnoty

$x = 1;        # $x je pravdivé
$x = 0;        # $x je nepravdivé
$x = "0";      # $x je nepravdivé
$x = undef;    # $x je enpravdivé
@pole = ();    # @pole ve skalárním kontextu je ne pravdivé
@pole = undef; # @pole ve skalárním kontextu je pravdivé,
               # protože obsahuje jeden prvek

Čísla

V Perlu existují čísla celá a čísla desetinná. Číselné hodnoty lze zapisovat několika způsoby. Ve skutečnosti Perl pracuje pouze s čísly reálnými s dvojnásobnou přesností (pokud ovšem nezakážete používání reálných čísel pomocí use integer).

Číselné literály

12345celé číslo kladné
-123celé číslo záporné
123.456číslo s desetinnou čárkou kladné
-123.456číslo s desetinnou čárkou záporné
1.23E16v semilogaritmickém tvaru
(1.23 krát 10 na 16)
-12e34 velké záporné číslo
-12e-34 velmi malé záporné číslo
0xFF, 0X2ešestnáctkové číslo
0247osmičkové číslo
0b111000binární číslo
1_123_456_789s podtržítky pro zvýšení čitelnosti
1_12e-1_2s podtržítky pro snížení čitelnosti

Řetězce

v97.104.111.106		# to samé jako "ahoj"
97.104.111.106		# to samé jako v97.104.111.106
Speciální znaky
\nnový řádek
\rnávrat vozíku
\ttabulátor
\fnová stránka
\bbackspace
\apípnutí
\eznak ESC
\044znak s ASCII hodnotou osmičkově
\0x26znak s ASCII hodnotou šestnáctkově
\0x{262f}znak s ASCII hodnotou šestnáctkově
\cCznak CTRL+C
\\znak \
\N{JMENO}znak se zadaným jménem
Modifikátory
\u  převede následující znak na velké písmeno
\lpřevede následující znak na malé písmeno
\Upřevede následující znaky na velká písmena
\Lpřevede následující znaky na malá písmena
\Qnásledující nealfanumerické znak uvede obráceným lomítkem
\Eukončuje \U, \L, \Q
Jiný zápis řetězců
ObyčejněJinakVýznamVkládání
''q//literálový řetězecne
""qq//literálový řetězec s vkládánímano
()qw//seznam řetězcůano
//m//nalezení vzoruano
s///s///nahrazeníano
y///tr///překladano
""qr//regulární výrazano

Víceřádkové řetězce

print <<KONEC_TEXTU;
první řádek textu
druhý řádek textu
třetí řádek textu
KONEC_TEXTU

print <<"KONEC_TEXTU";
první řádek textu
druhý řádek textu
třetí řádek textu
KONEC_TEXTU

# oba případy fungují stejně, uvnitř dochází 
# ke vkládání hodnot proměnných apod.

print <<'KONEC_TEXTU';
první řádek textu
druhý řádek textu
třetí řádek textu
KONEC_TEXTU

# uvnitř nedochází ke vkládání hodnot 
# proměnných apod.

print <<`KONEC_PRIKAZU`;
echo prvni
echo druhy
echo treti
KONEC_PRIKAZU

# provede uvedené příkazy

@cisla = ($cisla = <<KONEC) =~ /\d+/gm;
5 12
3 8
7
KONEC

print join ', ',@cisla;   # vytiskne "5, 12, 3, 8, 7"

Řetězce vzniklé z víceřádkového textu se mohou skládat za sebe.

\begin{verbatim}
print <<PRVNI, 123 , <<DRUHY x 3;
abc
PRVNI
xyz
DRUHY

# vytiskne
abc
123xyz
xyz
xyz

Automatické konverze mezi řetězci a čísly

Literálové symboly

Identifikátory začínající a končící dvěma podtržítky jsou v Perlu použity pro zvláštní účely. Literálové symboly __FILE__, __LINE__, __PACKAGE__ ukazují na soubor, řádek a balík používaný v okamžiku zjišťování hodnot těchto speciálních symbolů. Literál __END__ logicky ukončuje skript ještě před koncem souboru. Následující obsah je ignorován, ale je přístupný pomocí ovladače DATA. Podobnou funkci má symbol __DATA__, který otevírá ovladač DATA ve jmenném prostoru aktuálně používaného balíku. Při použití těchto symbolů uvnitř řetězce v uvozovkách nedojde ke vložení jejich hodnot.

Pole a seznamy

Hashe (asociativní pole)

Ovladače souborů

$FILE = "soubor.txt"
open FILE;
print FILE "text";

Formáty

Formáty slouží k vytváření vzhledově přívětivých výstupů. Výstupy jsou dány definicí formátu pomocí funkce format. Každý formát má své jméno odděleno od jméno ostatních typů objektů. Pokoušíme-li se zapisovat s využitím ovladače pomocí funkce write, vyhledá se formát, který má stejné jméno jako ovladač, a pomocí něho je výstup upraven.

Typegloby

© 2003, František Dařena

Valid XHTML 1.0! Valid CSS!