Třídění


Pro třídění má perl operátor sort(), který třídí prvky ve vzestupném pořadí (čísla, písmena - velká, malá). Operátor sort() vrací setříděný seznam.

Příklad:

Následující sekvence příkazů třídí pole x a výsledek ukládá do pole y.

@x = (zdenek,14,borek,1,84,Cesta,2);
@y = sort(@x);
print "@y \n";
Příkaz print zobrazí:
1 14 2 84 Cesta borek zdenek

Všimněte si, že čísla v seznamu nejsou tříděna numericky, ale jako řetězce (1 14 2 ...).

Pokročilé třídění

Perl poskytuje prostředky i pro jiné způsoby třídění. Je možné třídit seznam v sestupném pořadí nebo numericky.

Ke třídění jiným než standardním způsobem je potřeba definovat porovnávací postup (proceduru), který popíše, jak porovnat dva prvky. Tato procedura se bude volat pro každé dva prvky seznamu. Procedura musí určit, zda je první prvek menší, roven nebo větší než druhý prvek a vrátit výsledkový kód. Porovnávané hodnoty jsou do procedury předávané jako globální proměnné $a a $b.

Výsledkový kód porovnávací procedury je:

Pro pokročilé třídění použijeme volání: sort(jméno_procedury seznam).

Příklad procedury, která porovnává numericky:

sub numericke {
  if ($a < $b) {
     -1;
  }
  elsif ($a == $b) {
      0;
  }
  elsif ($a > $b) {
      1;
  }
}
Příklad numerického třídění:
@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";

Příkaz print v příkladu vypisuje tento seznam: 1 2 13 20 34 106.

Jedním z operátorů perlu je operátor pro numerické porovnání <=>, který vrací hodnoty:

Pomocí tohoto operátoru je možné proceduru numerické zkrátit do tvaru:
sub numericke {
  $a <=> $b;
}
nebo zapsat příkaz pro třídění přímo ve tvaru:
@tcis = sort ({$a <=> $b} @cis)

Třídění celého asociativního pole

V kapitole Asociativní pole jsme uvedli funkci foreach, která postupně pracuje s každým prvkem asociativního pole. Do této funkce je možné doplnit slovo sort, které zajistí zpracování klíčů nebo hodnot asociativního pole ve vzestupném pořadí.

Příklad:

%pole = ("prvni",24,"druhy",34,"treti",44);
foreach $klic (sort keys %pole) {
        print "$klic $pole{$klic}\n"; 
}
Uvedená sekvence příkazů tiskne prvky asociativního pole %pole vzestupně setříděné podle klíčů. Tedy:
druhy 34
prvni 24
treti 44


Další kapitola | Předchozí kapitola kapitola | Obsah