LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (10) - Pole

V dnešním díle si přiblížíme další z datových struktur a to pole.

21.12.2004 15:00 | Josef "jose" Kadlec | Články autora | přečteno 8203×

Pole je jedna z tzv. seznamová struktura, kam patří společně se strukturou hash. Pole je tedy seznam skalárních dat, které jsou seřazené od prvního do posledního prvku. Jak už jsem zmínil v některém z minulých dílů, pole poznáme tak, že jeho názvu předchází znak "@". Pro název samozřejmě platí skoro všechna pravidla tvorby názvů proměnných - tzn. že se rozlišují velká a malá písmena, maximální délka názvu je 255 znaků, ale je tu jeden rozdíl! Názvy polí mohou totiž mohou začínat číslicí. Platí pak také samozřejmě, že názvy polí a jiných proměnných mezi sebou nekolidují. K prvkům pole se přistupuje pomocí indexů prvků pole, což souvisí právě s tím, že pole jsou řazená.

A nyní se podíváme na to, jak mohou taková pole vypadat a jak se tvoří. Nejprve si vytvoříme prázdné pole:

@pole = ();

Teď si vytvoříme jednoduchá pole se skalárními daty:

@pole = (1, 2, 3, 4, 5); #pole s cisly
@pole = ('Pepa', 'Karel', 'Vojta'); #pole retezcu
@pole = (1, 'Pepa', 5+1, $var); #smisene pole

K jednoduššímu zápisu pole lze použít i příkazu qw a to takto:

@pole = qw(

	Po Ut St Ct
	Pa So Ne
);

Vidíme, že si vůbec nemusíme dávat práci s psaním oddělovacího znaku čárka a uvozovek.

Pole lze i vnořovat do sebe - tzn. pokud některými (nebo všemi) prvky pole jsou další pole. Ovšem nemusí to mít logický význam pro programátora, protože tato pole se sloučí do jednoho.

K prvkům pole se přistupuje pomocí indexu, který určuje pozici elementu v poli, přičemž pole jsou indexována od nuly. Takže když budu chtít například uložit řetězec "Vojta" do prvního prvku pole, udělám to takto:

$pole[0] = "Vojta";

Všimněme si, že tato proměnná nemá před názvem znak "@", ale přesto nemá s proměnnou $pole nic společného.

Pole je dynamické jako všechny proměnné v Perlu, takže nemusíte, jako například v programovacím jazyce C, určovat délku pole v deklaraci. Takže když máte například pole o pěti prvcích (tzn. do prvku s indexem 4, protože se indexuje od 0) a chcete přidat další prvek, tak to uděláte prostě takto:

$pole[5] = "dalsi sesty prvek pole";

Pokud se budeme snažit přidat prvek, který nenásleduje za poslední definovaný prvek a přidali by jste prvek v našem poli o šesti prvcích například na desátou pozici, tak budou chybějící prvky mezi těmito prvky vyplněný nedefinovými hodnotami. Hodnoty indexů mohou mít i zápornou hodnotu. Takové indexy se pak počítají od konce pole, takže například prvek s indexem -1 je poslední prvek.

Pokud chceme procházet pole v cyklu, tak je nejjednodušší a nejefektivnější použít cyklus foreach, jak už jsme si popsali v díle o cyklech. Pokud ale potřebujete použít pro zpracování pole cyklus while či for, tak potřebujete i znát index posledního prvku pole, abyste věděli, kdy má cyklus skončit. Index posledního prvku pole je uložen v proměnné $#pole. Skutečná délka pole - tzn. počet prvků v poli je uložená přímo v proměnné @pole. Takže když budete chtít uložit délku pole @pole do proměnné $delka_pole, tak to uděláte takto:

$delka_pole = @pole;

Je ovšem potřeba si dávat pozor na kontext, podle kterého data přiřazujeme.

Co když budete potřebovat vytvořit pole s posloupností čísel od 1 do 100. Asi těžko vypíšete každý prvek zvlášť. Můžete použít buď cyklu a nebo elegantnější zápisu:

@pole = (1 .. 100);

Funguje to i se znaky, takže znaky od "e" do "k" v abecedě vypíšete takto:

@pole = ('e' .. 'k');

Nad výpisem pole například na standardní výstup asi nemusíte přemýšlet a použijete prostě cyklus for s přístupem k prvkům přes indexy nebo cyklus foreach, ale existuje jedna elegantnější cesta, jak vytisknout pole (nebo zpracovávat jeho prvky).

print "@pole\n";

Všimněme si, že proměnná pole je v uvozovkách. Tento příkaz vypíše všechny prvky pole a to každý na jeden řádek.

Nyní si představíme funkce, které se typicky používají pro práci s poli. Pokud budeme chtít do pole přidat prvek (z pravé strany), tak bychom mohli použít něco podobného jako:

@pole = (@pole, $novy_element);

Zde je důležizé si dávat pozor na kontext přiřazení (viz. níže). K přidání dalšího prvku z pravé strany pole lze použít i funkci push takto:

push(@pole, $novy_element);

Touto funkcí je možné přiřazovat i více prvků najednou a to takto:

@pole = (1,2,3);
push(@pole,4,5,6);

Tímto jsme vytvořili pole o šesti prvcích, které představují posloupnost čísel od 1 do 6. Další užitečnou funkcí je funkce pop, která naopak prvky z pole odebírá (zase důležité upozornit, že z pravé strany pole - neboli od konce). Takže použití může vypadat takto:

$posledni_element = pop(@pole);

Poslední prvek z pole @pole se odebere a uloží do proměnné $posledni_element. Další funkce unshift a shift dělají obdobnou operaci, s tím rozdílem, že z levé strany pole - čili ze začátku pole. Příklad použití:

unshift(@fred, $novy_prvek); #prida prvek $a na zacatek pole
unshift(@fred, 1, 2, 3); #prida prvky 1, 2, 3 na zacatek pole
$posledni_prvek = shift(@pole); #odstrani prvni prvek z pole a ulozi ho do promenne $posledni_prvek

Další užitečnou funkcí je funkce reverse, která vrátí pole s obráceným pořadím prvků. Použití je prosté:

@pole = (1, 2, 3);
@pole = reverse(@pole); #pole nyni obsahuje prvky (3, 2, 1)

Mezi další funkce, které lze použít přímo s poli patří například funce sort, která vám seřadí prvky v poli od nejmenšího po největší (popř. u řetězců podle abecedy) a nebo například funkce chomp, která odstraní z konce každého prvku znaky nové řádky.

Nakonec si něco řekneme o kontextu přiřazení. Nejdříve se podíváme na pár příkladů přířazení, abychom viděli, jak se chovají:

($a, $b, $c) = (1, 2, 3); #priradi jednotlive prvky do jednotlivych prvku pole
($x, @pole) = ($a, $b, $c); #$a priradi do $x a $b, $c do @pole
($x, @pole) = @pole; #do $x priradi prvni prvek z @pole a @pole bude bez tohoto prvku

Co když ale zapíši takovéto dva zápisy:

$x = @pole;
($x) = @pole;

V prvním případě bude do proměnné $x uložen počet prvků pole. Zatímco v druhém případě bude do $x uložen první prvek pole. Proto je potřeba si dávat na kontext, ve kterém se chceme pohybovat.

V přístím díle se popereme s hashi.

Verze pro tisk

pridej.cz

 

DISKUZE

print "@pole" se chová trochu jinak 29.12.2004 15:26 Roman Vašíček




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

18.6.2018 0:43 /František Kučera

Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.


Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

7.5.2018 16:20 /František Kučera
Na stránkách spolku OpenAlt vyšla fotoreportáž Pražské srazy 2017 dokumentující srazy za uplynulý rok. Květnový pražský sraz na téma audio se bude konat 17. 5. 2018 (místo a čas ještě upřesníme).
Přidat komentář

17.4.2018 0:46 /František Kučera
Dubnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 4. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tématem tohoto srazu bude OpenStreetMap (OSM) aneb svobodné mapy.
Přidat komentář

16.3.2018 22:01 /František Kučera
Kulatý OpenAlt sraz v Praze oslavíme klasicky: u limonády a piva! Přijďte si posedět, dát si dobré jídlo a vybrat z mnoha piv do restaurace Kulový blesk, který najdete v centru Prahy nedaleko metra I. P. Pavlova na adrese Sokolská 13, Praha 2. Sraz se koná ve čtvrtek 22. března a začínáme v 18:00. Heslo: OpenAlt. Vezměte s sebou svoje hračky! Uvítáme, když si s sebou na sraz vezmete svoje oblíbené hračky. Jestli máte nějaký drobný projekt postavený na Arduinu, nějakou zajímavou elektronickou součástku, či třeba i pěkný úlovek z crowdfundingové akce, neváhejte. Oslníte ostatní a o zábavu bude postaráno.
Přidat komentář

13.2.2018 0:41 /František Kučera
Únorový pražský sraz OpenAltu se koná 15. 2. 2018 a tentokrát se vydáme na návštěvu do jednoho pražského datacentra. Sejdeme se v 17:50 v severovýchodní části nástupiště tramvajové zastávky Koh-I-Noor. Po exkurzi se přesuneme do restaurace U Pštrosa (Moskevská 49), kde probereme tradiční témata (svobodný software a hardware, DIY, CNC, SDR, 3D tisk…) a tentokrát bude k vidění i IoT brána od The Things Network.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze