Perl - programové konstrukce stokrát jinak

Hned na úvod se musím všem čtenářům omluvit za trochu nadnesený nadpis. Rád bych ukázal jak lze klasické programové konstrukce zapsat různými způsoby pomocí perlu. Je pravdou že TIMTOWTDI, obzvláště pak v Perlu, ale ke stovce způsobů zápisu jednoho příkladu se asi opravdu nedopracujeme.

Toto není kurz programování v jazyce Perl a ani se jím nesnaží být. Pro první seznámení s Perlem vřele doporučuji knihu pana Satrapy 'Perl pro zelenáče' (vydal Neokortex) jenž se mi jeví býti velmi příjemným, vtipným a přesto informačně dosti obsažným dílem. Pokročilejším pak doporučuji alespoň nahlédnout do Learning Perl (může být i český pčeklad, ale je v něm dosti chyb) a excelentní Object Oriented Programming in Perl[TODO: verify book name] od Damiana Conwaye.

Jen pro pořádek se letmo zmíním o pár základních věcech.

Reprezentace čísel

(TODO: duální povaha - číslo x text - automatická konverze)

List (Seznam, Pole)

Klasicke pole s číselným indexem jak je známe z jiných programovacích jazyků.

Hash (Asocoativni pole)

Pole jehož indexem nemusí být nutně číslo, ale libovolný textový řetězec.

Příklad 1

Zadani:

Vypiste po sobe vsechy prvky seznamu oddelene mezerou

Mozne postupy reseni (a urcite naleznete i dalsi)

# nejaky ten seznam at mame co vypisovat
my @pole = ( 1, '23', 'text');

# clovek zvykly na jazyk C
for (my $i = 0; $i < scalar @pole; $i++) {
  # zpracovani aktualniho prvku pole
  print $pole[$i];
  print " ";
}
!!!
TODO: preformatovat
!!!

Komentar:
- scalar @pole
	vynucenim skalarniho kontextu ziskame delku pole
- $pole[$i]
	vypis prvku pole
- " "
	oddelovaci mezera

# o neco lepsi je zapis
for (my $i = 0; $i < @pole; $i++) {
  # zpracovani aktualniho prvku pole
  print $pole[$i], ' ';
}

Komentar:
- @pole
	jelikoz je zde skalarni kontext implicitni, neni nutne si jej
	vynucovat
- $pole[$i], ' '
	print pracuje se seznamem a nedochazi k interpolaci textu diky
	tomu, ze nejsou pouzity dvojite uvozovky 

# 'perlivejsi' zapis
for (@pole) {
  # zpracovani aktualniho prvku pole
  print $_, ' ';
}

Komentar:
- for (@pole)
	predavame primo seznam prvku. Aktualne zpracovavany prvek je
	pak ulozen v implicitni promenne $_

	nelze pouzit v pripade potrebby prace s indexem

# muzeme pouzit o neco mene ukecany zapis
print "$pole[$i] " for (@pole);

Komentar:
- "$pole[$i] "
	interpolaci promenne uvnitr textu diky tomu, ze jsou pouzity
	dvojite uvozovky

# lepsi z hlediska trailing space je pak
print join(' ', @pole);

Komentar:
- join(' ', @pole)
	spojime prvky seznamu do jednoho retezce jenz predame k vypisu
	pomoci print

	vyhodou teto konstrukce je chybejici mezera za poslednim
	prvkem a moznost volby oddelovace

# a perlovy guru zapise jen
print "@pole";

Komentar:
- "@pole"
	je nutne pouzit interpolaci. V opacnem pripade totiz nejsou
	vlozeny mezery mezi jednotlive prvky seznamu

	tento zapis nedava mezeru za posledni prvek seznamu

	nelze pouzit v pripade potreby jineho oddelovace :-(