LINUXSOFT.cz
Username: Password:     
    CZ UK PL

> 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 | read 9660×

DISCUSSION   

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

 

DISCUSSION

For this item is no comments.

Add comment is possible for logged registered users.
> Search Software
> Search Google
1. Pacman linux
Download: 4879x
2. FreeBSD
Download: 9067x
3. PCLinuxOS-2010
Download: 8564x
4. alcolix
Download: 10949x
5. Onebase Linux
Download: 9661x
6. Novell Linux Desktop
Download: 0x
7. KateOS
Download: 6244x

1. xinetd
Download: 2413x
2. RDGS
Download: 937x
3. spkg
Download: 4760x
4. LinPacker
Download: 9966x
5. VFU File Manager
Download: 3198x
6. LeftHand Mała Księgowość
Download: 7203x
7. MISU pyFotoResize
Download: 2808x
8. Lefthand CRM
Download: 3563x
9. MetadataExtractor
Download: 0x
10. RCP100
Download: 3120x
11. Predaj softveru
Download: 0x
12. MSH Free Autoresponder
Download: 0x
©Pavel Kysilka - 2003-2024 | mailatlinuxsoft.cz | Design: www.megadesign.cz