V dnešním díle se především dozvíme jaký je rozdíl mezi lokálními a globálními proměnnými a doplníme
ještě nějaké další zkutečnosti o funkcích.
16.11.2004 15:00 | Josef "jose" Kadlec | přečteno 9661×
Pro nás existovaly zatím pouze globální proměnné. To jsou proměnné, které mají prakticky platnost v každé části programového kódu. Takže ať jsme inicializovali proměnnou uvnitř nebo vně funkce (platí i pro jiné entity), tak jsme k proměnné mohli přímo přistupovat odkudkoliv - tzn. mohli jsme ji například vypsat zase vně nebo uvnitř funkce.
Existují však ještě tzv. lokální proměnné - tzn. proměnné s omezenou platností. Tyto proměnné se definují ve funkcích a mají platnost právě pro dobu běhu dané funkce. Tzn. že k nim nemůžete přímo přistupovat z vnějšku funkce - a ani z funkce, která je do této funkce vnořena (uvidíme, že toto neplatí pro tzv. semiprivate variables). Jistě mi dáte za pravdu, že používání lokálních proměnných výrazně zvýší čistotu a zpřehlední strukturu programového kódu. A kdo používá funkce, měl by určitě používat i lokální proměnné. Docílí tím vlastně toho, že funkce budou skutečně úplně samostatné entity, ke kterým lze přistupovat pouze pomocí argumentů.
Lokální proměnnou zadefinujeme modifikátorem my
a to v těle funkce např. takto:
my
$var; # jedna lokalni promenna
my ($var1,
$var2); # dve lokalni promenne
my
$var = "false"; # jedna inicializovaná lokální proměnná
Dále nutno říci, že globální a lokální proměnné mezi sebou nekolidují. Takže lze definovat lokální proměnnou se stejným názvem jako již existující globální proměnná - a naopak. Dokažme si na příkladu.
#!/usr/bin/perl -w
$var = "false";
print "Hodnota $var pred volanim funkce fce()
je: $var.\n";
&fce();
print "Hodnota $var po volanim funkce fce() je:
$var.\n";
sub fce
{
my $var;
$var = "true";
print "Hodnota $var uvnitr funkce fce() je:
$var.\n";
}
Pokud tento skript spustíme, měli bychom zjistit, že s globální proměnnou $var
se vůbec
nic nestalo ( tzn. nezměnila se její hodnota). Přesvědčíme se na výpisu:
bash-2.05b$ ./test.pl Hodnota $var pred volanim funkce fce() je: false. Hodnota $var uvnitr funkce fce() je: true. Hodnota $var po volanim funkce fce() je: false.
Důkaz sporem by mohl vypadat tak, že proměnná $var
nebude definována jako lokální.
Potom by výpis vypadal takto:
bash-2.05b$ ./test.pl Hodnota $var pred volanim funkce fce() je: false. Hodnota $var uvnitr funkce fce() je: true. Hodnota $var po volanim funkce fce() je: true.
Dále si řekneme něco o již zmíněných "semiprivate variables" - takže něco ve smyslu polo-lokální
proměnné. Tyto proměnné se definují modifikátorem local
. Rozdíl oproti proměnným
definovaných modifikátorem my
je ten, že tyto proměnné mají svojí platnost i pro funkce
vnořené. Pro lepší pochopení ukáži opět příklad:
#!/usr/bin/perl -w
$var = "false";
&fce2();
&fce();
&fce2();
sub fce
{
local $var = "true";
&fce2();
}
sub fce2
{
"Hodnota \$var je:
$var.\n";
}
Výpis tohoto skriptu bude vypadat takto:
bash-2.05b$ ./test.pl Hodnota $var je: false. Hodnota $var je: true. Hodnota $var je: false.
První volání funkce fce2()
vypíše hodnotu globální proměnné $var
.
Následuje volání funkce fce()
, kde se definuje polo-lokální proměnná $var
a
změní se její hodnota a následně se ještě v těle této funkce volá fce2()
, která má
hodnotu proměnné vypsat. Vidíme, že se předala změněná hodnota. Pokud bychom definovali lokální
proměnnou modifikátorem my
, tak by se tato změněná hodnota nepředala a tudíž by
obsahovala původní hodnotu. Čili pokud bychom užili místo modifikátoru local
,
modifikátor my
, tak by výpis po spuštění skriptu vypadal takto:
bash-2.05b$ ./test.pl Hodnota $var je: false. Hodnota $var je: false. Hodnota $var je: false.
Doufám, že v této chvíli máte v lokálních proměnných jasno a budete je hojně používat - opravdu se to vyplatí.