Portál AbcLinuxu, 26. května 2024 16:45

Programujeme v PERLu - II

13. 1. 2004 | Jindřich Skupa
Články - Programujeme v PERLu - II  

Je tu další díl, ve kterém si ukážeme cykly, podmínky, hledání, nahrazování a další šikovné funkce.

Začneme tedy cykly, jako první uvedu cyklus for. For je cyklus řízený indexem pro předem známý počet provedení. Jeho syntaxe je zřejmá z následující ukázky a popisu :

for ($i=1;$i<=10;$i++)
{
    print "$i \n";
}

Syntaxe: for ([výraz];[výraz];[výraz]) blok_příkazů;

(to, co je v hranatých závorkách, je nepovinné)

blok_příkazů = obsah složených závorek, skupina příkazů

Prvním parametrem je příkaz(výraz), který se provede jen jednou (většinou se používá pro nastavení počáteční hodnoty), následuje podmínka, která určuje počet opakování. A posledním parametrem je příkaz, který se vykoná při každem průbehu cyklu. Pokud neznáte Céčko, tak si asi kladete otázku, co dělá $i++;. Céčko zjednodušuje přiřazování - v PERLu je to stejné, viz tabulku.

zápisje ekvivalentem
$i++;$i=$i+1;
$i--;$i=$i-1;
$i+=10;$i=$i+10;
$i-=10;$i=$i-10;
$i=$i**3;$i=$i*$i*$i;

(mocnina funkce, za ** se dává mocnitel)

Dalším cyklem je while, to je cyklus s podmínkou na začátku, tento cyklus se opakuje, dokud je podmínka pravdivá.

$i=-1;
while ($i!=0)
{
   $i=<STDIN>;
}

Syntaxe: while (výraz) blok_příkazů [continue blok_příkazů2]

Tento cyklus bude probíhat, dokud nezadáte z klávesnice nulu. K cyklu while v PERLu existuje i jeho obrácený kamarád, který naopak probíhá, pokud není podmínka pravdivá:

$i=-1;
until ($i==0)
{
   $i=<STDIN>;
}

Syntaxe: until (výraz) blok_příkazů [continue blok_příkazů2]

Pro tvoření podmínek jsou nezbytné operátory, níže je krátký přehled.

Operátory

numerické

řetězcové (porovnání)

řetězcové (další)

Operátory použijeme i u podmíněného příkazu if a jeho opačného kamaráda unless:

if ($i<10)
{
   print "$i je mensí než deset";
}
elsif ($i==10)
{
    print "$i je rovno deseti";
}
else
{
    print "$i je vetší než deset";
}

Syntaxe: if (výraz) blok_příkazů1 [[eslif (výraz) blok_příkazů2] else blok_příkazů3]

Pokud je splněna podmínka (výraz je pravdivý), pak se vykoná blok_příkazů1. Pokud nebyla podmínka splněna, vyhodnotí se další výraz. Když byl pravdivý, provede se blok_příkazů2, v případě, že ani jedna podmínka nebyla pravdivá, vykoná se blok_příkazů3.

Unless pracuje podobně, jen postrádá část elsif a výraz vyhodnocuje opačně.

Funkce pro hledání a nahrazování

$retezec =~ s /vzorek/nový_text/ [i][m][s]

Prohledá $retezec na shodu se vzorek (může být i regulární výraz), pokud něco nalezne, nahradí to nový_text. Pokud přidáte i, znamená to, že nezáleží na velikosti písmen, m bere $retezec jako více řádků, s jako jeden. Pokud nic nenahradil, tak vrací 0 - nepravda.

$retezec =~ /vzorek/ [g][i][m][s]

Hledá v $retezec zadaný vzorek (regulární výraz). Pokud použijete g, může se shoda použít jako interátor ve skalárním kontextu. V seznamovém kontextu vrací seznam skládající se z podvýrazů vyhovujících podle závorek ve vzorku.

$retezec =~ tr /prohledávaný seznam/nahrazovací seznam/ [c][d]

Nahrazuje všechny znaky prohledávaného seznamu na znaky z nahrazovacího seznamu. Volitelné modifikátory: c doplňuje prohledávaný seznam, d maže všechny znaky, které k sobě nemají ekvivalent v nahrazovacím seznamu.

Matematické funkce

Konverzní funkce

Podprogramy a moduly

Pokud máme rozsáhlý kód, kde se některá část vícekrát opakuje čí je program mírně nepřehledný, tak použijeme podprogram (vlastní funkce).

Ten se tvoří příkazem sub:

sub název, [(prototyp)] blok_příkazů

Sub se píše na začátek programu. Pokud není zadán blok příkazů, bude se jednat jen o dopřednou deklaraci, kterou budeme muset níže popsat (doplnit). Parametry podprogramu se předávají ve speciálním poli @_. Pro definici požadovaných parametrů lze použít definici pomocí prototypu.

return [výraz]

ukončuje podprogram s výrazem jako návratovou hodnotou.

Podprogamy se následně volají dvěma možnými postupy. Buď název_podprogramu nebo &název_podprogramu.

Moduly (balíčky tvořené vámi nebo někým jiným) se do programu natahují příkazem use na začátku skriptu:

use jméno_modulu [[verze]seznam]

To je tak ze základů vše potřebné, ale plánuji článek o CGI v PERLu.

Související články

Programujeme v PERLu - I
BASH
Začíname KProgramovať
AbcLinuxu pro programátory
Apache Ant - jak na složité projekty

Odkazy a zdroje

perl.org
perl.com
CPAN: Comprehensive Perl Archive Network

Další články z této rubriky

LLVM a Clang – více než dobrá náhrada za GCC
Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
Reverzujeme ovladače pro USB HID zařízení
Linux: systémové volání splice()
Programování v jazyce Vala - základní prvky jazyka

Diskuse k tomuto článku

13.1.2004 11:19 Tomas
Rozbalit Rozbalit vše operatory?
Odpovědět | Sbalit | Link | Blokovat | Admin
Tenhle clenek mi prijde dost zvlastni, ... proc bylo nahodne vybrano zrovna techno nekolik operatoru ?? a je detailne popsany co znamena napr. $x++ (ktery zna vetsina lidi z ostatnich jazyku)... ale o operatorech specifickych pro perl ani zminka: resp. o nekterych ano: operatory x a ** ale napr. <=> cmp tu nevidim ... myslim ze lepsi by bylo uvest nejaky rozumnejsi prehled operatoru a ne vybirat jen nekolik (napr. casteji pouzivanych - i kdyz nevim, ze bych nekdy pouzil umocnovani, zato porovnavani pouzivam kazdou chvili pri nejakym specialnim trideni pole apod) a myslim ze vetsinu lidi kdyz kouka po nejakem prog. jazyku, ktery se nauci, tak je zajima prave to co je jine/lepsi ... T.
13.1.2004 18:25 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše operatory?
Přesně tak. Co je to třeba =~? V článku to spadne z čistého nebe.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
13.1.2004 15:15 Roman Vasicek
Rozbalit Rozbalit vše for - jenom neco?
Odpovědět | Sbalit | Link | Blokovat | Admin

Proc u cyklu for neuvedete take variantu se seznamem?

  for (@seznam) { prikazy }

Osobne daleko casteji pouzivam tuto konstrukci namisto te v clanku uvedene. Napriklad pro zpracovani vsech polozek hashe

  for (keys %nejaky_hash) {
    zpracuj_aktualni_klic
  }
13.1.2004 20:22 social | skóre: 20 | Plzeň
Rozbalit Rozbalit vše for - jenom neco?
omlouvám se za neúplnost, neuvědomil jsem si praktičnost této konstrukce (lze to napsat složiteji, funguje to taky).
13.1.2004 15:59 tyctor
Rozbalit Rozbalit vše odflaknute?
Odpovědět | Sbalit | Link | Blokovat | Admin
podla mna tento clanok autor jednoducho odflakol. hlavne ten zaver clanku mi pripada akoby sa ho uz nemohol dockat. od druheho dielu som cakal viac.
14.1.2004 14:23 Martin Kysela | skóre: 18 | blog: The Martin Kysela's Blog | Praha
Rozbalit Rozbalit vše mno...
Odpovědět | Sbalit | Link | Blokovat | Admin
I snaha se ceni... Osobne doufam a verim, ze se autor nenecha odradit a bude zde uvedene komentare brat jako podnet k dalsimu zlepsovani. Verim, ze pristi casti serialu budou o neco propracovanejsi.

// Martin Kysela
// Martin Kysela
20.1.2004 20:20 social | skóre: 20 | Plzeň
Rozbalit Rozbalit vše mno...
Uznavam ze tento clanek se mi podle reakci moc nepovedl. Jinak jsem se docela snazil, asi se mi bohuzel nepodarilo odhadnout naroky ctenaru.
14.1.2004 16:21 venca
Rozbalit Rozbalit vše tr
Odpovědět | Sbalit | Link | Blokovat | Admin
Nejak jsem nepochopil, co dela ten tr (kterymi znaky nahrazuje). A co dela continue u cyklu while a until take neni popsano.
20.2.2004 09:51 Roman Vasicek
Rozbalit Rozbalit vše tr

tr/src_list/dst_list/ nahrazuje jednotlive znaky ze src_list odpovidajicimi znaky z dst_list - prvni prvnim, druhy druhym, atd.

10.2.2006 02:20 ldx
Rozbalit Rozbalit vše Re: tr
Namisto continue se pouziva next - pokracovat novym cyklem od zacatku, redo - pokracovat znovu aktualnim cyklem, last - ukoncit cyklus (obdoba break), continue - rozdeli cyklus na casti, ktere se zvlast vykonaji pri redo a next. Jinak pro kompletni manual k perlu (seznam funkci, knihoven atd.) viz http://perldoc.perl.org/....

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.