Formáty

Formáty realizují prezentační část jazyka Perl. Slouží k vytváření vzhledově přívětivých výstupů. Takový výstup se může skládat z dynamicky vkládaných hodnot a z předem určených znaků (rámečky, čáry).

Pro definování výstupu je třeba nadefinovat formát. Každý formát má své jméno a toto jméno patří do zvláštního prostoru jmen odděleně od jmen proměnných, podprogramů apod.

Formát se uplatní při volání funkce write, která pro formátování výstupu použije aktuálně vybraný formát.

Pro definici formátu se používá funkce format. Jako argument dostane jméno formátu, pak následuje =, znak nového řádku a vlastní definice formátu. V ní se střídají řádky popisující vzhled sestavy a řádky obsahující čárkami oddělené hodnoty vkládané do výstupních řádků. Definice formátu končí znakem . na novém řádku. Není-li zadáno jméno formátu, použije se jméno STDOUT.

format JMÉNO =
<vzhled sestavy>
<vkládané hodnoty>
<vzhled sestavy>
<vkládané hodnoty>
<.....>
.

Zabírá-li seznam hodnot více než jeden řádek, je nutné hodnoty uzavřít do dvojice složených závorek.

Každá vkládaná hodnota tvoří v rámci formátu výstupní pole. Toto pole má délku zadanou počtem znaků určujících zarovnání (<, >, |). Není-li bezprostředně za znakem vložení hodnoty v případě řetězců některý z těchto znaků (v případě čísla může následovat znak #), bude z hodnoty zobrazen pouze první znak. Jinak bude z hodnoty zobrazen takový počet znaků, kolik symbolů udávajících zarovnání bude bezprostředně následovat.

Tabulka: Speciální znaky používané ve formátech

Znak Význam
@ začátek vkládané hodnoty
^ začátek vkládané hodnoty, hodnota bude zobrazována postupně
< pole bude zarovnáno vlevo
> pole bude zarovnáno vpravo
| pole bude zarovnéno na střed
# v prvním sloupci znamená komentář
jinde znamená, že hodnota bude zobrazena jako číslo
. v číselné hodnotě bude zobrazena desetinná tečka
~ při víceřádkovém tisku nebudou vytištěny koncové prázdné řádky
~~ atomaticky zajišťuje víceřádkový tisk
@* \> pole pro víceřádkový text
format =
# vycentrovaná hodnota, na 10 míst,
# ohraničeno znakem =
=@|||||||||=
$hodnota
.

Formáty a rozsahy platnosti proměnných

Použijeme-li pro vložení hodnoty proměnnou, musí být viditelná v místě definice formátu. Je-li to proměnná deklarovaná pomocí my, musí být poprvé použita před definicí formátu. V opačném případě se nepodaří hodnotu zobrazit. Je-li to proměnná globální, stačí, když v okamžiku výpisu bude obsahovat hodnotu.

# V okamžiku definice formátu je použito globální proměnné
# $promenna, její hodnota není definována, ale v okamžiku 
# použití formátu hodnotu známe.
format =
# vycentrovaná hodnota, na 10 míst,
# ohraničeno znakem =
=@|||||||||=
$hodnota
.

$hodnota = 123;
write;
# vytiskne
# =   123    =

# V okamžiku definice formátu je použito lexikálně vymezené
# proměnné $promenna, její hodnota není definována, ale definice
# formátu je v jejím rozsahu platnosti. V okamžiku použití formátu 
# tedy bude obsah proměnné vytištěn tak, jak bychom chtěli.
my $hodnota;
format =
=@|||||||||=
$hodnota
.

$hodnota = 123;
write;
# vytiskne
=   123    =

# V okamžiku definice formátu je použita globální proměnná
# $promenna, její hodnota není definována. V okamžiku použití 
# formátu existuje i lexikálně vymezená proměnná, která ale 
# nebyla viditelná v době definice formátu. Proto se její hodnota 
# nezobrazí, ale použije se hodnota globální proměnné.
format =
=@|||||||||=
$hodnota
.
my $hodnota = 123;
write;

# vytiskne
=          =

# V okamžiku definice formátu je použita globální proměnná
# $promenna, její hodnota je definována. V okamžiku použití 
# formátu existuje i lexikálně vymezená proměnná, která ale 
# nebyla viditelná v době definice formátu. Proto se její hodnota 
# nezobrazí, ale použije se hodnota globální proměnné.
$hodnota = 'abc';
format =
=@|||||||||=
$hodnota
.

my $hodnota = 123;
write;
# vytiskne
=   abc    =

Definice formátů a vkládání hodnot

Máme-li proměnnou, která má větší délku, můžeme její hodnotu zobrazit na více řádcích. Místo symbolu @ tak použijeme symbol ^. Formát pro zobrazení hodnoty této proměnné pak bude zabírat tolik řádků, na kolik jich budeme chtít proměnnou zobrazit.

$hodnota = 'Hodně dlouhý text';

format = 
# vycentrovaná hodnota, na 6 míst, na jeden řádek,
# ohraničeno znakem =
=^|||||=
$hodnota
.

write;
# vytiskne
=Hodně =

format = 
# vycentrovaná hodnota, na 6 míst, na čtyři řádky,
# ohraničeno znakem =
=^|||||=
$hodnota
=^|||||=
$hodnota
=^|||||=
$hodnota
=^|||||=
$hodnota
.

write;
# vytiskne
=Hodně =
=dlouhý=
= text =
=      =

Použití symbolu ~ (zobrazí se jako mezera).

format = 
# vycentrovaná hodnota, na 10 míst, max. na čtyři řádky,
# ohraničeno znakem =
=^|||||=~
$hodnota
=^|||||=~
$hodnota
=^|||||=~
=hodnota
=^|||||=~
$hodnota
.

$hodnota = 'Hodně dlouhý text';
write;
# vytiskne
=Hodně =
=dlouhý=
= text =

Použijtí symbolu ~~.

format = 
# vycentrovaná hodnota, na 10 míst, libovolný
# počet řádků, ohraničeno znakem =
=^|||||=~~
$hodnota
.

$hodnota = 'Hodně dlouhý text';
write;
# vytiskne
=Hodně =
=dlouhý=
= text =

Při použití symbolu ^ musí být vkládaná hodnota uložena ve skalární proměnné, protože dochází k modifikaci této hodnoty. Zobrazí se takový počet znaků, který se vejde do výstupního pole a tento podřetězec je z proměnné odstraněn (při dalším zobrazení hodnoty této proměnné se už ve výstupu neobjeví a bude se zobrazovat od následujícího znaku). (Pro zabránění modifikace hodnoty proměnné je třeba použít jinou pomocnou proměnnou.)

format =
=^<<<<<<=
$hodnota
.

$hodnota = "Hodně dlouhý text";
write;
# vytiskne
# =Hodně  =

print $hodnota;
# vytiskne 'dlouhý text'

Pro zobrazení čísla je možné za symbolem @ použít znak #, který implicitně provádí zarovnání vpravo. Při použití znaku . bude číslo vytištěno s desetinnou tečkou na zadaný počet desetinných míst. Neobsahuje-li číslo dostatečný počet desetinných míst, bude doplněno nulami na konci. Má-li číslo více desetinných míst, bude zaokrouhleno tak, aby ho bylo možné zobrazit na požadovaný počet desetinných míst.

format = 
=@#####.#####=
$hodnota
.

$hodnota = 123.456;
write;
# vytiskne
=   123.45600=

# pro format =@#####.##=
# vytiskne =   123.46=

Obsahuje-li hodnota vkládaná pomocí znaku @ znak konce řádku, bude vytištěna jenom část od začátku do tohoto znaku. Chceme-li tomu zabránit, vložíme hodnotu pomocí @*. V tomto případě dojde v místě, kde se nachází znak konce řádu, k odřádkování a řetězec tak bude zobrazen celý. Symbol @* by se měl v definici fomátu vyskytnout samotný na celém řádku.

format =
=@<<<<<<<<<=
$hodnota
.

$hodnota = "aaa\nbbb\nccc";

write;
# vytiskne
=aaa       =

format =
@*
$hodnota
.

$hodnota = "aaa\nbbb\nccc";

write;
# vytiskne
aaa
bbb
ccc

Při použití symbolu ^ jsou všechny bílé znaky kromě \r považovány za jednoduchou mezeru. Znak \r vynutí vytištění znaku konce řádku, je-li to umožněno definicí formátu.

U hodnot, které se zobrazovaly na více řádků, nebylo provedeno odřádkování vždy po určitém počtu znaků, ale pokud to šlo, tak po slovech. Kde začíná a končí slovo pozná Perl podle nastavení promenné $: ($FORMAT_LINE_BREAK_CHARACTERS).

format =
=^<<<<<<<<<=~~
$hodnota
.

$hodnota = "Hodně dlouhý text";
write;

# vytiskne
=Hodně     =
=dlouhý    =
=text      =


$:='';
$hodnota = "Hodně dlouhý text";
write;

=Hodně dlou=
=hý text   =

Výběr formátu a ovladače

Pro formátování výstupu pomocí funkce write se použije formát, který má stejné jméno jako ovladač souboru, do kterého zapisujeme.

write SOUBOR;
# při zápisu do souboru pomocí ovladače SOUBOR
# se použije formát se jménem SOUBOR

write;
# není specifikován soubor, píše se do STDOUT,
# použije se formát se jménem STDOUT

Pokud chceme změnit ovladač, do kterého budeme zapisovat (a tím i formát), použijeme funkci select. Jako argument zadáme jméno ovladače a při použití funkce print nebo write se použije implicitně tento ovladač.

open VPRAVO, ">vpravo.txt";

format =
=@<<<<<=
$hodnota
.

format VPRAVO =
=@>>>>>=
$hodnota
.

$hodnota = 123;
write;       # na STDOUT vytiskne =123   =

select VPRAVO;
write;       # do souboru vpravo.txt vytiskne =   123=

Chceme-li pouze změnit použitý formát k danému ovladači, použijeme proměnnou $~ ($FORMAT_NAME).

format =
=@<<<<<=
$hodnota
.

format VPRAVO =
=@>>>>>=
$hodnota
.

$hodnota = 123;

# není zadán ovladač, použije se ovladač STDOUT
# a k němu formát STDOUT
write;      # na STDOUT vytiskne =123   =

# změna aktuálního jména formátu
$~= VPRAVO; # nebo $~= 'VPRAVO'
# není zadán ovladač, použije se ovladač STDOUT
# a k němu formát VPRAVO
write;     # na STDOUT vytiskne =123   =
           #                    =   123=

Máme-li vybrán jiný ovladač než STDOUT, je třeba zvolit jiný postup pomocí funkce select.

open VPRAVO, ">vpravo.txt";

format VLEVO =
=@<<<<<=
$hodnota
.

format VPRAVO =
=@>>>>>=
$hodnota
.

$hodnota = 123;

# zapisujeme do souboru vpravo.txt, používáme
# formát VPRAVO
write VPRAVO;

# uložíme si aktuálně použitý formát a vybereme nový
$stary = select VPRAVO;
# pro formát VPRAVO použijeme formát VLEVO
$~= VLEVO;
# nastavíme zpět formát používaný před změtou $~, při použití
# ovladače VPRAVO se bude používat formát VLEVO
select $stary;

# teď píšeme do ovladače VPRAVO, používáme 
# formát VLEVO
write VPRAVO;

# soubor vpravo.txt obsahuje
=   123=
=123   =

Stránkovaný výstup

Existuje-li definice formátu se jménem, které je stejné jako jméno ovladače následované _TOP, bude tento formát použit vždy na začátku každé stránky.

Při provádění výstupu pomocí funkce write se automaticky provádí stránkování. V proměnné $- je uložen počet řádků, které se ještě na stránku vejdou. Až je tato hodnota 0, dojde k odstránkování a při dalším použití funkce write se opět použije formát <JMÉNO>_TOP, je-li definován. Nastavením hodnoty této proměnné ručně dojde k nucenému odstránkování.

# definice formátu začátku stránky
format STDOUT_TOP =
Sestava vytvořena dne:@<<<<<<<<<<<<<<< Strana @<<<<
aktualni_datum(), $%
+---------------------+---------------------------+
|JMÉNO                |E-MAIL                     |
+---------------------+---------------------------+
.

# definice formátu pro jednotlivé záznamy
format =
|@<<<<<<<<<<<<<<<<<<<<|@<<<<<<<<<<<<<<<<<<<<<<<<<<|
$jmeno,                $email  
.

$jmeno = 'František Dařena'; $email = 'darena@pef.mendelu.cz';
write;
$- = 0;  # nucené odstránkování

$jmeno = 'Jiří Rybička'; $email = 'ryb@pef.mendelu.cz';
write;

# vytiskne
Sestava vytvořena dne:10.12.2002       Strana 1
+---------------------+---------------------------+
|JMÉNO                |E-MAIL                     |
+---------------------+---------------------------+
|František Dařena     |darena@pef.mendelu.cz      |


Sestava vytvořena dne:10.12.2002       Strana 2
+---------------------+---------------------------+
|JMÉNO                |E-MAIL                     |
+---------------------+---------------------------+
|Jiří Rybička         |ryb@pef.mendelu.cz         |

V souvislosti s formáty existuje řada speciálních proměnných.

Aktuální číslo zobrazované stránky je uloženo v proměnné $%. Počet řádků na stránce obsahuje proměnná $= (standardně hodnota 60). Počet řádků, které je ještě možné na aktuální stránku vytisnkout obshuje proměnná $-.

Název aktuálního formátu je obsažen v proměnné $~. Proměnná $^ obsahuje jméno formátu pro záhlaví.

© 2004, František Dařena

Valid XHTML 1.0! Valid CSS!