Podprogramy (subroutines) Pojmenované kousky programu, které –tvoří logicky ucelené části –se v programu opakují Jsou zapsány na jednom místě a v případě potřeby se volají Hlavní výhody –šetří práci, protože se píšou jen jednou –jsou při každém volání stejné –přehlednost hlavního programu
Kdy? Když určitou část programu použijeme více než jednou –např. tisk hlavičky na každou stránku výstupu Když chceme učinit program přehlednějším –program může v ideálním případě vypadat třeba takto: #!/usr/bin/perl nastaveni(); cteni_vstupu(); vlastni_vypocet(); vystup();
Jak? Definice podprogramu –klíčové slovo sub –jméno podprogramu (stejná pravidla jako pro proměnné, pole a asoc. pole) –blok s kódem (tělo podprogramu) sub vystup { print “Toto je výstupem podprogramu vystup.\n”; } Volání podprogramu: &vystup; nebo vystup(); (radši)
Kam? Téměř kamkoli Podprogramy se obvykle zapisují NA KONEC hlavního programu Mohou se napřed deklarovat sub vystup; a vlastní kód zapsat až později (na konec). Pak se mohou volat bez závorek, ale psaní závorek je dobré, protože z toho je jasně vidět, že jde o podprogram.
Funkce x podprogram Obecně Funkce dostane určitý počet argumentů (může být i nulový) a na konci vydá výstupní hodnotu – může být definovaná uživatelem, nebo součástí jazyka (takovým se někdy říká operátory – např. substr) Podprogram je podobný funkci, ale definuje ho vždy uživatel a nemusí vydat žádnou výstupní hodnotu, jen něco udělá. V Perlu – rozdíl nezávisí na výstupních hodnotách Funkce a operátory poskytuje Perl. Podprogramy (skripty) píše uživatel.
Předávání parametrů Parametry se předávají podprogramům stejně jako funkcím, tedy v závorce Parametrů může být libovolně mnoho Parametry se přiřadí do speciálního které se automaticky vytvoří pro každý podprogram. soucet(34, 2345, 98, 100); soucet(5..15); sub soucet { my $soucet = 0; foreach $k {$soucet += $k;} print "Součet čísel je $soucet.\n"; }
Výstupní hodnota Každý podprogram má výstupní hodnotu - hodnota posledního příkazu, který je v něm proveden. –tedy v našem příkladu je to výsledná hodnota $soucet Může se napsat jako poslední příkaz podprogramu Nebo pomocí return (nemusí být poslední v bloku) Volání: sub soucet { my $soucet = 0; foreach $k {$soucet += $k;} $soucet; } return $soucet; $vysledek = soucet(34, 2345, 98, 100);
Lokální a globální proměnné Podprogram je zapsán v (alespoň jednom) bloku Uvnitř podprogramu je rozumné používat lokální proměnné deklarované jako my Jestliže Perl nenajde nějakou proměnnou v příslušném bloku, hledá globální proměnnou stejného jména deklarace our – není třeba, jen když je use strict; $a = "Pepa"; $b = podprogram(4); print $a; # co se vytiskne? my $a = "Pepa"; $b = podprogram(4); print $a; # co se vytiskne?
Lokální proměnné – deklarace local mylocal my $my = "A"; our $local = "B"; b(); a(); b(); sub a { my $my = "C"; local $local = "D"; b(); } sub b { print “MY: $my\n"; print "LOC: $local\n"; } AB CD AD AB sub a : sub b : AB
Lokální proměnné – deklarace local mylocal my $my = "A"; our $local = "B"; b(); a(); b(); sub a { $my = "C"; local $local = "D"; b(); } sub b { print “MY: $my\n"; print "LOC: $local\n"; } CB CD CD AB sub a : sub b : AB
Lokální proměnné – deklarace local mylocal my $my = "A"; our $local = "B"; b(); a(); b(); sub a { my $my = "C"; local $local; b(); } sub b { print “MY: $my\n"; print "LOC: $local\n"; } AB C A AB sub a : sub b : AB
my $my = "A"; our $local = "B"; b(); a(); b(); sub a { my $my = "C"; local $local = "D"; b(); } sub b { print “MY: $my\n"; print "LOC: $local\n"; } Lokální proměnné – deklarace local odložení hodnoty proměnné {$my = "A";} $local = "B"; b(); a(); b(); sub a { my $my = "C"; local $local = "D"; b(); } sub b { print “MY: $my\n"; print "LOC: $local\n"; } my $my = "A"; our $local = "B"; b(); a(); b(); sub a { my $my = "C"; local $local; b(); } sub b { print “MY: $my\n"; print "LOC: $local\n"; }
Kromě nejjednodušších příkladů není vhodné používat přímo. Vyplatí se přiřadit jednotlivé prvky pole vlastním (lokálním) proměnným sub jmeno_zkratka { my ($jmeno, $prijmeni) my $jm = substr($jmeno,0,1); return ($jm, ". ", $prijmeni); } my $jmeno = my $prijmeni = Jiné způsoby (Podobně se zachází s parametry programu – my $jmeno = $_[0]; my $prijmeni = $_[1];
Rekurze Pes jitrničku sežral Podprogram volá sám sebe –hlídat parametry –hlídat konec, aby nedošlo k nekonečnému vnořování Příklady ?