Trideni


Pro trideni ma perl operator sort(), ktery tridi prvky ve vzestupnem poradi (cisla, pismena - velka, mala). Operator sort() vraci setrideny seznam.

Priklad:

Nasledujici sekvence prikazu tridi pole x a vysledek uklada do pole y.

@x = (zdenek,14,borek,1,84,Cesta,2);
@y = sort(@x);
print "@y \n";
Prikaz print zobrazi:
1 14 2 84 Cesta borek zdenek

Vsimnete si, ze cisla v seznamu nejsou tridena numericky, ale jako retezce (1 14 2 ...).

Pokrocile trideni

Perl poskytuje prostredky i pro jine zpusoby trideni. Je mozne tridit seznam v sestupnem poradi nebo numericky.

Ke trideni jinym nez standardnim zpusobem je potreba definovat porovnavaci postup (proceduru), ktery popise, jak porovnat dva prvky. Tato procedura se bude volat pro kazde dva prvky seznamu. Procedura musi urcit, zda je prvni prvek mensi, roven nebo vetsi nez druhy prvek a vratit vysledkovy kod. Porovnavane hodnoty jsou do procedury predavane jako globalni promenne $a a $b.

Vysledkovy kod porovnavaci procedury je:

Pro pokrocile trideni pouzijeme volani: sort(jmeno_procedury seznam).

Priklad procedury, ktera porovnava numericky:

sub numericke {
  if ($a < $b) {
     -1;
  }
  elsif ($a == $b) {
      0;
  }
  elsif ($a > $b) {
      1;
  }
}
Priklad numerickeho trideni:
@cis = (34,20,2,13,1,106);
@tcis = sort(numericke @cis);
print "$tcis[0] $tcis[1] $tcis[2] $tcis[3] $tcis[4] $tcis[5]\n";

Prikaz print v prikladu vypisuje tento seznam: 1 2 13 20 34 106.

Jednim z operatoru perlu je operator pro numericke porovnani <=>, ktery vraci hodnoty:

Pomoci tohoto operatoru je mozne proceduru numericke zkratit do tvaru:
sub numericke {
  $a <=> $b;
}
nebo zapsat prikaz pro trideni primo ve tvaru:
@tcis = sort ({$a <=> $b} @cis)

Trideni celeho asociativniho pole

V kapitole Asociativni pole jsme uvedli funkci foreach, ktera postupne pracuje s kazdym prvkem asociativniho pole. Do teto funkce je mozne doplnit slovo sort, ktere zajisti zpracovani klicu nebo hodnot asociativniho pole ve vzestupnem poradi.

Priklad:

%pole = ("prvni",24,"druhy",34,"treti",44);
foreach $klic (sort keys %pole) {
        print "$klic $pole{$klic}\n"; 
}
Uvedena sekvence prikazu tiskne prvky asociativniho pole %pole vzestupne setridene podle klicu. Tedy:
druhy 34
prvni 24
treti 44


Dalsi kapitola | Predchozi kapitola kapitola | Obsah