#! /usr/bin/perl use strict; use warnings; use Data::Dumper; ## ------------------------------------------------------------- ## Hinweis: Wenn man die "Lektion" nachvollziehen möchte, so sollte ## man den Quellcode von oben nach unten immer stückweise in ein ## eigenes Programm übernehmen. ## ## Einfach immer ein neues Stück cut'n'pasten, das Stück verstehen ## und falls ein "print" drin ist, ggf. ausführen, um das Resultat zu ## sehen. ## ## Die logischen Schritte sind durch Linien getrennt. ## ------------------------------------------------------------- # Geht los: # Gibt keine Datentypen, # nur Datenstrukturen # # Struktur am Symbol erkennbar: # $-Zeichen: Skalar # @-Zeichen: Array/Liste # %-Zeichen: Hash # ----------------- # Skalar my $s = 'Sabine'; $s = 17; # ----------------- # Arrays my @a = ( 'affe', 'loewe', 'tiger' ); print Dumper (\@a); # ----------------- # Hash # 1 my %h = ( 'name' , 'Mustermann', 'vorname', 'Sabine', 'geboren', '27.06.1972' ); # ----------------- # 2 @a = ( 'name' , 'Mustermann', 'vorname', 'Sabine', 'geboren', '27.06.1972' ); # ----------------- # Hash = Array mit Deutung Key/Value %h = @a; $h{adresse} = 'Goldstrasse 15'; # ----------------- # Warum klappte das grad eben? # Zwischenspiel: Arrays kopieren # Kopie von @a my @acopy = @a; my ($a1, $a2, $a3, $a4, $a5, $a6) = @a; my ($b1, $b2, $b3) = ( 'aa', 'bb', 'cc' ); # ----------------- # Zurück zu Hashes # 3: Syntaktischer Zucker %h = ( 'name' => 'Mustermann', 'vorname' => 'Sabine', 'geboren' => '27.06.1972' ); # ----------------- # 4: Syntaktischer Zucker 2: # Autoquote (nur für Keys, nur bei '=>') %h = ( name => 'Mustermann', vorname => 'Sabine', geboren => '27.06.1972' ); print Dumper (\%h); # ----------------- # Referenzen # (warum man sie braucht, kommt gleich) my $h_ref = \%h; print Dumper ($h_ref); # ----------------- # Referenzen initialisieren # Hashref, geschweifte Klammern $h_ref = { 'name' => 'Mustermann', 'vorname' => 'Sabine', 'geboren' => '27.06.1972' }; $h_ref->{adresse} = 'Essener Str. 17'; # ----------------- # Arrayref, eckige Klammern my $a_ref = [ 'name' , 'Mustermann', 'vorname' , 'Sabine', 'geboren' , '27.06.1972' ]; # ----------------- # (Gleich versteht man, wofür Referenzen notwendig) # Flattening, 1. my @A = ( 'affe', 'loewe', 'tiger', ( 'kakerlake', 'spinne', 'kaefer' ), 'giraffe' ); print Dumper (\@A); # ----------------- # Flattening, 2. my @A2 = ( 'affe', 'loewe', 'tiger', [ 'kakerlake', 'spinne', 'kaefer' ], 'giraffe' ); print Dumper (\@A2); # ----------------- # Flattening bei Subs sub f1 { my @args = @_; foreach (@args) { print "Param: " . Dumper ($_) . "\n"; } } f1 ('affe', 'loewe', 'tiger', ( 'kakerlake', 'spinne', 'kaefer' ), 'giraffe'); print "-------------------\n"; # ----------------- f1 ('affe', 'loewe', 'tiger', [ 'kakerlake', 'spinne', 'kaefer' ], 'giraffe'); # ----------------- # note the last commas f1 ('affe', 'loewe', 'tiger', { 'kakerlake' => 'lieb', 'spinne' => 'boese', 'kaefer' => 'so lala', }, 'giraffe'); # ----------------- # --- Mein Style ("... is' so geil") --- # immer Referenzen my $a = [ 'affe', 'tiger', 'loewe', ]; my $h = { 'name' => 'Mustermann', 'vorname' => 'Sabine', 'geboren' => '27.06.1972', }; # ermöglich "natürliche" Verwendung von Variablen # # Funktionsaufrufe: # f1 ($a, $h); <----> f1 (@a, %h); # # Funktionsrückgabewerte: # return $a; # ----------------- # Lieber explizit in Array dereferenzieren, # z.B. bei "push" (Builtin; will Array als 1. Arg.) # push ($a, 'giraffe'); # gänge nicht! push (@{$a}, 'giraffe'); # ausfuehrliche Schreibweise fuer @{$a} push (@$a, 'giraffe'); # Kurzschreibweise fuer @{$a} # ----------------- # -- Zugriff bei Referenzen -- # (Allerdings: Syntaxhighlighting geht verloren) print $a->[0]."\n"; print $h->{name}."\n"; # ----------------- # Manchmal nehme ich doch richtige Arrays, # fuer besseres Highlighting sub f2 { my @a; my %h; print $a[0]."\n"; push @a, 'zomtec'; print $h{'name'}."\n"; return \@a; } # ----------------- # multiple return sub f3 { return ('Name', 'Stadt', 'Land'); } my ($name, $stadt, $land) = f3(); print $name, $stadt, $land, "\n"; # ----------------- # Anwendung fuer Array-Returns: Verkettete 'map's # Wofür "map"? my @A = ( 'affe', 'loewe', 'tiger', ); # Folgendes immergleiches Programmierpattern: @a = (); foreach (@A) { push ( @a, "PRAEFIX:".$_ ); } # ----------------- # "map" == "initialisieren" + "foreach" + "push" # Tip: 'map' immer von hinten lesen # Kopieren @a = map { "PRAEFIX:".$_; } @A; print Dumper (\@a); # ----------------- # In Reihe geschaltete Operationen # Nochmal der Tip: 'map' immer von hinten lesen @a = map { $_ .":SUFFIX" } map { "PRAEFIX:".$_ } @A; print Dumper (\@a); # ----------------- # Ende.