Balíky a moduly

Porovnanie :: Python

Balíky

Každý modul potrebuje svoju sadu mien, aby sa názvy premenných nezamieňali s iným kódom. Na to slúžia balíky.

Balík sa deklaruje pomocou kľúčového slova package. Jeho platnosť končí deklaráciou iného balíka, dosiahnutím konca súboru alebo konca bloku, kde bol balík deklarovaný. Každý balík má svoju vlastnú sadu premenných. V balíku sú definované premenné nezávisle na tom, ktoré sú mimo neho.

Základným balíkom je balík main. Zápis identifikátora je nasledovný:

<typ promennej><meno balíka>::<meno promennej>

Pod typom premennej máme na mysli znak $ pre skalárne premenné, @ pre pole, % pre hashe a prázdny reťazec pre formáty a ovladače. Typ premennej sa udáva pred menom balíka.

print $AAA::meno # výstup bude hodnota premennej meno z balíka AAA
BBB::funkcie # volanie podprogramu funkcie z balíka BBB

Nasledujúci kód nám demonštruje použitie funkcie package.

$prem = 1; # do premennej prem z balíka main(je implicitný balík) je priradená hodnot 1
package InyBalik; # aktuálny balík main prepneme na balík InyBalik
$prem = 2; # do premennej prem z balíka InyBalik je priradená hodnot 2
package main; # opäť sa prepneme na balík main
print $prem; # výstup bude hodnota 1 - hodnota premennej prem z balíka main

V prípade, že je aktuálnym balíkom balík InyBalik, môžeme sa dostať k hodnote premennej iného balíka uvedením plne kvalifikovaného názvu.

$prem = 1;
package InyBalik;
$prem = 2;
print $main::prem; # výstup bude hodnota 1 - hodnota premennej prem z balíka main

Moduly

Modul chápeme ako súhrn funkcií, dátových štruktúr, ktoré môžeme opakovane používať v rôznych programoch. Existujú moduly pre prácu so súbormi, pre prácu s databázami, webovým rozhraním, pre sieťovú komunikáciu a pod. Štandardná inštalácia Perlu obsahuje knižnicu približne s 1500 modulmi.

V Perli sú moduly realizované tak, že modul je balík, ktorý je uložený v súbore rovnakého mena a s príponou .pm. Pravidlom je, že mená modulov začínajú veľkým písmenom. Výnimku tvoria tzv. pragmatické moduly. Sú to zvláštne moduly, ktoré ovplyvňujú činnosť prekladača a ich mená sa píšu malými písmenami.

Zavedenie modulu

Modul sa môže používať až po jeho zavedení. Na to slúžia vstavané funkcie use a require. Tieto funkcie nie je nutné použiť na začiatku programu. Môžu sa používať kdekoľvek v programe.

Funkcie require jednoducho zahrnie daný súbor do programu pomocou mechanizmu do SUBOR. Ako argument očakáva meno súboru, ktorý má byť načítaný. Ak vynecháme príponu súboru a nepoužijeme úvodzovky alebo apostrofy na ohraničenie mena súboru, automaticky sa doplní prípona .pm.

Require sa prevádza v dobe behu programu. Akékoľvek akcie vzniknuté vo vnútri súboru sú viditeľné až od tohoto okamihu.

print $CGI::VERSION; # neinicializovaná premenná
require CGI; # zavedenie modulu funkciou require
print $CGI::VERSION; # vytlačí 3.05

Zavedenie modulu pomocou use prebieha vo fáze prekladu. Tá predchádza vlastnému behu programu. Preto všetky akcie v takto použitom module sú viditeľné v rámci celého programu.

print $CGI::VERSION; # vytlačí 3.05
use CGI;

Nasledujúci príklad nám predstavuje definíciu modulu Mat, dokáže sčitavať, odčítavať, násobiť a deliť. Čiže obsahuje definíciu štyroch programov.

package Mat;
use strict;

sub sucet { # vstupom je n sčítancov, výstup je súčet vstupov
my $soucet = 0;
$soucet += $_ while $_ = shift @_;
return $soucet;
}

sub sucin { # vstupom je n činiteľov, výstup je súčin vstupov
my $soucin = 1;
return undef if !@_;
$soucin *= $_ while $_ = shift @_;
return $soucin;
}

sub rozdiel { # vstupom sú 2 čísla, výstup je ich rozdiel
return $_[0] - $_[1];
}

sub podiel { # vstupom sú 2 čísla, výstup je ich podiel
return undef if $_[1] == 0;
return $_[0] / $_[1];
}

1;

use Mat; # import daného mudulu
print Mat::sucin(10, 8, 6, 3); # použitie funkcie sucin
print Mat::rozdiel(7, 2); # použitie funkcie rozdiel