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

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ů

13.9.2017 8:00 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

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

> Poslední diskuze

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

Více ...

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