
# Pojedyncza linia komentarza zaczyna się od znaku hasha (płotka) "#".

#### Typy zmiennych w Perlu

# Zmienna zaczyna się od symbolu dolara "$".
# Prawidłowa nazwa zmiennej zaczyna się od litery lub podkreślnika "_",
# po których następuje dowolna ilość liter, cyfr i podkreślników.

### W Perlu występują trzy główne typy zmiennych: skalary, tablice i hasze.

## Skalary
#  Skalar przechowuje pojedynczą wartość:
my $zwierze = "wielbłąd";
my $odpowiedź = 42;

# Wartości skalarne mogą być ciągami znaków, liczbami całkowitymi lub
# zmiennoprzecinkowymi, zaś Perl automatycznie dokonuje konwersji pomiędzy nimi,
# w zależności od wykonywanego kodu/kontekstu.

## Tablice
#  Tablica przechowuje listę wartości:
my @zwierzęta = ("wielbłąd", "alpaka", "sowa");
my @liczby    = (23, 42, 69);
my @mieszanka = ("wielbłąd", 42, 1.23);

## Hasze
#  Hasz przechowuje zestawy par klucz-wartość:
my %kolor_owocu = ('jabłko', 'czerwony', 'banan', 'żółty');

# Możesz używać białych znaków (spacje, tabulatory) i operatora strzałki "=>"
# by czytelniej sformatować zapis hasza:
my %kolor_owocu = (
    jabłko  => 'czerwony',
    banan => 'żółty',
);

# Skalary, tablice i hasze są bardziej wyczerpująco udokumentowane w dokumencie
# [perldoc perldata](http://perldoc.perl.org/perldata.html).

# Bardziej złożone typy danych mogą być stworzone poprzez używanie referencji,
# które pozwalają Ci zbudować listy i hasze wewnątrz list i haszy.

#### Warunki logiczne i pętle

# W Perlu występują typowe warunki i pętle.
if ($var) {
    ...
} elsif ($var eq 'bar') {
    ...
} else {
    ...
}

unless (warunek) {
    ...
}
# Powyższy zapis jest równoznaczny zapisowi "if (!warunek)"

# Perlowy skrócony zapis warunków:
print "Siema!" if $rozochocony;
print "Nie mamy bananów" unless $banany;

# Pętla while
while (warunek) {
    ...
}

# Pętle for oraz foreach
for ($i = 0; $i <= $max; $i++) {
    ...
}

foreach (@tablica) {
    print "Tym elementem jest $_\n";
}

# lub

foreach my $iterator (@tablica) {
    print "Iterowanym elementem jest $iterator\n";
}

#### Wyrażenia regularne

# Perlowe wyrażenia regularne są tematem tak rozległym, jak wymagającym.
# Istnieje ogromna ilość dokumentacji w artykułach takich jak
# [perlrequick](http://perldoc.perl.org/perlrequick.html),
# [perlretut](http://perldoc.perl.org/perlretut.html) i inne.
# W dużym skrócie, podstawy perlowych wyrażeń regularnych są następujące:

# Proste dopasowanie:
if (/foo/)       { ... }  # prawda jeżeli $_ zawiera "foo"
if ($a =~ /foo/) { ... }  # prawda jeżeli $a zawiera "foo"

# Prosta zamiana:
# Zamienia "foo" na "bar" w zmiennej $a
$a =~ s/foo/bar/;
# Zamienia WSZYSTKIE WYSTĄPIENIA "foo" na "bar" w zmiennej $a
$a =~ s/foo/bar/g;

#### Pliki i I/O

# Możesz otworzyć plik do odczytu lub zapisu używając funkcji "open ()".
open (my $odczyt,    "<",  "odczyt.txt") or die "Błąd otwierania input.txt: $!";
open (my $zapis,     ">",  "zapis.txt")  or die "Błąd otwierania output.txt: $!";
open (my $dopisanie, ">>", "my.log")     or die "Błąd otwierania my.log: $!";

# Pliki możesz odczytywać z otworzonego handlera używając operatora "<>"
# (operator diamentowy). W kontekście skalarnym (przypisanie wyniku do skalara)
# operator ten zczytuje pojedynczą linię pliku, w kontekście listowym
# (przypisanie wyniku do tablicy) zczytuje całą zawartość pliku, przypisując
# każdą linię jako kolejny element listy:
my $linia = <$in>;
my @linie = <$in>;

#### Perlowe funkcje (procedury)

# Pisanie funkcji (procedur) jest proste:
sub logger {
    my $wiadomosc_do_loga = shift;
    open (my HANDLER, ">>", "my.log") or die "Błąd otwierania my.log: $!";
    print HANDLER $wiadomosc_do_loga;
}

# Teraz można używać napisanej funkcji, tak jak każdej innej wbudowanej
# funkcji perlowej:
logger ("Mamy funkcję perlową");

