Perl (6) - Funkce II

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 9295×

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í.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=520