# Einzeilige Kommentare beginnen mit dem # Symbol.


#### Perl Variablen Typen

#  Variablen beginnen mit einem Sigil, das ist ein Symbol das den Typ anzeigt.
#  Ein erlaubter Variablen-Name beginnt mit einem Buchstaben oder einem
#  Unterstrich, gefolgt von beliebig vielen weiteren Buchstaben, Zahlen und
#  Unterstrichen.

### Perl hat drei Haupt-Typen von Variablen: $scalar, @array, und %hash.

## Scalare
#  Ein Scalar repräsentiert einen einzelnen Wert:
my $animal = "camel";
my $answer = 42;

# Scalare Werte können Zeichenketten, Ganzzahlen und Gleitkomma-Zahlen sein.
# Perl konvertiert automatisch zwischen diesen Werten wenn nötig.

## Arrays
#  Ein Array repräsentiert eine Liste von Werten:
my @animals = ("camel", "llama", "owl");
my @numbers = (23, 42, 69);
my @mixed   = ("camel", 42, 1.23);



## Hashes
#   Ein Hash repräsentiert ein Set von Schlüssel/Wert Paaren:

my %fruit_color = ("apple", "red", "banana", "yellow");

#  Man kann Leerzeichen und den "=>" Operator verwenden um sie schön darzustellen:

my %fruit_color = (
  apple  => "red",
  banana => "yellow",
);
# Scalare, Arrays und Hashes sind in perldata sehr genau dokumentiert.
# (perldoc perldata)

# Komplexere Daten-Typen können mithilfe von Referenzen konstruiert werden.
# Dies erlaubt das erstellen von Listen und Hashes in Listen und Hashes.

#### Bedingte Ausführungs- und Schleifen-Konstrukte.

# Perl besitzt die üblichen Bedingte Ausführung- und Schleifen-Konstrukte

if ($var) {
  ...
} elsif ($var eq 'bar') {
  ...
} else {
  ...
}

unless (condition) {
  ...
}
# Dies ist die etwas leserliche Version von "if (!Bedingung)"

# Die Perl-Eigene Post-Bedingungs-Schreibweise
print "Yow!" if $zippy;
print "We have no bananas" unless $bananas;

#  while
while (condition) {
  ...
}


# Für Schleifen und Iterationen
for (my $i = 0; $i < $max; $i++) {
  print "index is $i";
}

for (my $i = 0; $i < @elements; $i++) {
  print "Current element is " . $elements[$i];
}

for my $element (@elements) {
  print $element;
}

# Implizite Iteration
for (@elements) {
  print;
}

# Die Perl-Eigene Post-Bedingungs-Schreibweise nochmals
print for @elements;

#### Reguläre Ausdrücke

# Die Unterstützung von Perl für reguläre Ausdrücke ist weit und tiefgreifend.
# Sie ist ausführlich in perlrequick, perlretut und sonstwo dokumentiert.
# Die Kurzfassung:

# Einfaches Vergleichen
if (/foo/)       { ... }  # Wahr wenn "foo" in $_ enthalten ist
if ($a =~ /foo/) { ... }  # Wahr wenn "foo" in $a enthalten ist

# Einfache Substitution

$a =~ s/foo/bar/;         # Ersetzt foo mit bar in $a
$a =~ s/foo/bar/g;        # Ersetzt ALLE VORKOMMNISSE von foo mit bar in $a


#### Dateien und Ein-/Ausgabe

# Dateien werden mit der "open()" Funktion zur Ein- oder Ausgabe geöffnet.

open(my $in,  "<",  "input.txt")  or die "Can't open input.txt: $!";
open(my $out, ">",  "output.txt") or die "Can't open output.txt: $!";
open(my $log, ">>", "my.log")     or die "Can't open my.log: $!";

# Von einem geöffneten Datei-Handle kann mit dem "<>" Operator gelesen werden.
# In einem Scalaren-Kontext liest man damit eine einzelnen Zeile vom Datei-Handle.
# In einem Listen-Kontext wird damit die komplette Datei eingelesen. Dabei
# entspricht jede Zeile einem Element der Liste:

my $line  = <$in>;
my @lines = <$in>;

#### Schreiben von Subroutinen

# Subroutinen schreiben ist einfach:

sub logger {
  my $logmessage = shift;

  open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";

  print $logfile $logmessage;
}

# Nun können wir die Subroutine genau wie eine eingebaute Funktion verwenden:

logger("We have a logger subroutine!");
