Perl-Praxis. Subroutinen.

Ähnliche Dokumente
Perl-Praxis. Subroutinen. Jörn Clausen

Perl-Praxis. Subroutinen. Jörn Clausen, Jan Krüger Jens Reeder, Alex Sczyrba. AG Praktische Informatik Technische Fakultät Universität Bielefeld

Einführung in Perl. Packages, OO-Programmierung

Objektorientiertes Programmieren

Threads. Netzwerk - Programmierung. Alexander Sczyrba Jan Krüger

Objektorientiertes Programmieren

Perlkurs WS 2014/15: 08 Referenzen

Perl-Praxis. CGI-Skripte. Madis Rumming, Jan Krüger.

Einführung in Perl. Hashes, Referenzen, Listen von Listen

Perl-Praxis CPAN.

Programmierung und Angewandte Mathematik

6 Speicherorganisation

Perl-Praxis. CGI-Skripte. Jörn Clausen

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Perl-Praxis. CGI-Skripte. Jörn Clausen Jens Reeder, Jan Krüger

Objektorientiertes Programmieren

Objektorientierte Programmierung mit C++ (WS 2016/2017)

Informatik I (D-MAVT)

Perl-Praxis. Dateien und Daten. Jörn Clausen

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

FORTRAN77. eine höllische Programmiersprache. Christian Sternecker. Sommersemester TU-München

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

Systemnahe Programmierung in C (SPiC)

Objektorientiertes Programmieren

Benutzerfunktionen Was ist eine Funktion, was ist eine Prozedur?

Programmierkurs Python I

Komplexe Datenstrukturen

Perl-Praxis CPAN. Jörn Clausen

Algorithmen und Datenstrukturen

Programmieren I. Methoden-Spezial Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

Repetitorium Programmieren I + II

EWS, WS 2016/17 Pfahler I-1

Perl-Praxis. CGI-Skripte.

Grundlagen der Informatik 8. Funktionen I

Kamelbuch

Klassen und Objekte. Klassen und Objekte

Funktionen in Python

6 Speicherorganisation

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Funktionen in Matlab. Nutzerdefinierte Funktionen können in.m-datei gespeichert werden

javascript Coding-Guidelines 2. Ausgabe Februar 2015 Der Guideline beschreibt den verwendeten Coding-Stil von javascript als eigene Richtline.

Perl-Praxis. Dateien und Daten.

Angewandte Mathematik und Programmierung

Perl-Praxis CPAN.

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Bash-Skripting Linux-Kurs der Unix-AG

Vorsemesterkurs Informatik Übungsaufgaben. Tag 4a - Python

Fachhochschule Südwestfalen Wir geben Impulse. Kontrollstrukturen und Schleifen in Octave

Einleitung Grundlagen Erweiterte Grundlagen Zusammenfassung Literatur. C: Funktionen. Philip Gawehn

Musterlösung Klausur 11/ Fragen zu utf-8: 1.1. Welche zwei Methoden gibt es, um STDIN und STDOUT auf utf-8 zu setzen.

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

WS2018/ Oktober 2018

Inhaltsverzeichnis. Grundlagen und Einführung (1. Band) 1

Perl-Praxis CGI-Skripte 0-0/22

Speicherklassen (1) Lokale Variablen

Einführung in Perl. WWW, Teil 3: CGI-Skripte

Hallo Haskell. (Funktionale Programmierung) Prof. Dr. Oliver Braun. Letzte Änderung: :08. Hallo Haskell 1/23

1 pulsierender Speicher

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Komplexe Datenstrukturen

C++ - Einführung in die Programmiersprache Funktionen. Leibniz Universität IT Services Anja Aue

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

6. Funktionen, Parameterübergabe

System-Makro in time.h : #define CLOCKS_PER_SEC 1000 Frühere Makro-Bezeichnung (z.t. noch gebräuchlich): #define CLK_TCK CLOCKS_PER_SEC//aus:time.

Einführung in Java. Arne Hüffmeier. Angelehnt an Java-Vorkurs der Freitagsrunde. Methoden implementieren. Michelle Liebers, Dennis Hoffmann

Komplexe Datenstrukturen

Funktionen. mehrfach benötigte Programmteile nur einmal zu schreiben und mehrfach aufzurufen

Thomas Sillmann. Swift im Detail HANSER

Informatik II Übung 05. Benjamin Hepp 3 April 2017

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Einführung in Python (2)

Musterlösung

Lex und Yacc Lt. Worf, scannen Sie das Schiff! 300dpi, Sir?

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Kontrollfragen Mikrocontroller Programmiersprache C H1203 Felix Rohrer

1 Berechnung von Summen (ca = 10 Punkte)

Standardkonstrukte in Java

Selbststudium OOP7 & ALG2 Auftrag

Hallo Haskell. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :06. Hallo Haskell 1/23

10 Block 10: Verwendung von Modulen in Perl

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2009/10

Objekterkennung auf Bildern mit OpenCV und Image::ObjectDetect

Komplexe Datenstrukturen

F Zeiger, Felder und Strukturen in C

Kapitel Was ist ein Header? Was ist ein Body? Header: public Account(String newowner, int newpin)

2. Programmierung in C

Einführung in Perl. O'REILLY Beijing Cambridge Farnham Köln Sebastopol Taipei Tokyo. Randal L. Schwartz, Tom Phoenix & brian dfoy

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Informatik I: Einführung in die Programmierung

Bash-Skripting Linux-Kurs der Unix-AG

Kapitel 7: Rekursion. Inhalt. Rekursion: Technik Rekursion vs. Iteration

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

C-Grundlagen. zur Programmierung des MicroControllersystems MiCoWi

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Transkript:

Perl-Praxis Subroutinen Jörn Clausen joern@techfak.uni-bielefeld.de 1

Übersicht Subroutinen Sichtbarkeitsbereiche, scoping Parameter Modularisierung 2

Subroutinen Warum Funktionen/Prozeduren/Methoden? keine Code-Duplikation Faktorisierung Strukturierung kein Spaghetti-Code in Perl: Subroutinen 3

Subroutinen, cont. Beispiel: &usage if $#ARGV < 0; sub usage { die "usage: $0 file [file...]\n"; alternativer Aufruf: usage() keine Vorwärtsdeklaration nötig $0 enthält den Namen des Perl-Skripts 4

Rückgabewert Block evaluiert zu letztem Ausdruck: print "time: ", clock(),"\n"; sub clock { ($s, $m, $h) = localtime(time()); $time = "$h:$m:$s"; besser: expliziter Rückgabewert sub clock { ($s, $m, $h) = localtime(time()); return("$h:$m:$s"); 5

Rückgabewert, cont. Liste als Rückgabewert möglich ($hour, $min, $sec) = clock(); Rückgabe vom Kontext abhängig: $time = clock(); Abfrage des Kontextes: sub clock { ($s, $m, $h) = localtime(time()); if (wantarray) { return($h, $m, $s); else { return("$h:$m:$s"); 6

Aufgaben Der Befehl uname liefert Informationen über den Rechner und sein Betriebssystem (siehe auch uname(1)). Schreibe eine Subroutine hwinfo, die im skalaren Kontext den Namen des Rechners zurückliefert und im Array-Kontext eine Liste mit dem Rechnernamen, dem Betriebssystem und dessen Versionsnummer. $name = hwinfo(); ($name, $os, $ver) = hwinfo(); $name = hwinfo(); print "hostname: $name\n"; ($name, $os, $ver) = hwinfo(); print "hostname: $name, operating system: $os, version: $ver\n"; sub hwinfo { $name = uname -n ; chomp($name); if (wantarray) { $os = uname -s ; chomp($os); $ver = uname -v ; chomp($ver); return($name, $os, $ver); else { return($name); 7

Sichtbarkeit Blöcke durch geschweifte Klammern: {... Sichtbarkeit von Variablen? $a = 10; { $a = 20; print "inside block: a is $a\n"; print "outside block: a is $a\n"; Variablen in Perl global inside block: a is 20 outside block: a is 20 8

lexical scoping lexikalische Variable in Block überdeckt globale Variable: $a = 10; { my $a = 20; print "inside block: a is $a\n"; print "outside block: a is $a\n"; Reichweite : schließende Klammer des aktuellen Blocks inside block: a is 20 outside block: a is 10 9

lokale Variablen temporäres Überschreiben globaler Variablen: $a = 10; $b = 11; { my $a = 20; local $b = 21; print "inside block: a is $a, b is $b\n"; printvars(); print "outside block: a is $a, b is $b\n"; sub printvars { print "in sub: a is $a, b is $b\n"; inside block: a is 20, b is 21 in sub: a is 10, b is 21 outside block: a is 10, b is 11 10

Parameterübergabe Parameter an Subroutine übergeben: $teiler = ggt(15, 35); Parameter stehen in @_: sub ggt { my $num1 = $_[0]; my $num2 = $_[1];... typisches Idiom: sub ggt { my ($num1, $num2) = @_; 11

Aufgaben Die Fakultät n! einer natürlichen Zahl n ist definiert als n! = n i = 1 2... (n 1) n i=1 oder rekursiv durch { 1 falls n = 1 n! = n (n 1)! sonst Implementiere beide Varianten. Wie ist das Laufzeitverhalten der rekursiven Subroutine im Vergleich zur iterativen? iterative Variante: sub fak { my ($n) = @_; my $prod = 1; while ($n > 1) { $prod *= $n--; return($prod); rekursive Variante: sub fak { my ($n) = @_; if ($n > 1) { return($n * fak($n-1)); else { return(1); 12

variable Parameterzahl in anderen Sprachen problematisch in Perl der Normalfall: $sum1 = sum(5, 8, 4, 12, 7, 3); $sum2 = sum(3, 9, 6, 1); sub sum { my $sum = 0; foreach $num (@_) { $sum += $num; return($sum); wieder formale Parameter : my (@nums) = @_; 13

Aufgaben Das arithmetisches Mittel x und die Standardabweichung s einer Folge von Zahlen x 1, x 2,..., x n berechnet sich durch x = n i=1 x i n s = n i=1 (x i x) 2 n 1 Schreibe eine Subroutine mean, die im skalaren Kontext den Mittelwert und im Listen-Kontext Mittelwert und Standardabweichung zurückliefert: $avg = mean(4, 7, 12, 9, 32, 19); ($avg, $dev) = mean(4, 7, 12, 9, 32, 19); sub meandev { my (@xs) = @_; my $n = @xs; my $msum = 0; foreach $x (@xs) { $msum += $x; my $xbar = $msum/$n; if (wantarray) { my $dsum = 0; foreach $x (@xs) { $dsum += ($x - $xbar)**2; my $s = sqrt($dsum / ($n - 1)); return($xbar, $s); else { return($xbar); 14

Parameterübergabe, cont. Was sind hier die Probleme? @mix = zipper(@a, @b); # (a0, b0, a1, b1, a2, b2, a3, b3) (@even, @odd) = untangle(5,2,7,8,10,3,4,9,7,1); Wie lassen sie sich lösen? @mix = zipper(\@a, \@b); ($even_ref, $odd_ref) = untangle(5,2,7,8,10,3,4,9,7,1); Implementiere die beiden Subroutinen zipper und untangle sub zipper { my ($a_ref, $b_ref) = @_; my @zip = (); my @a = @$a_ref; my @b = @$b_ref; while (@a and @b) { push(@zip, shift(@a), shift(@b)); push(@zip, @a, @b); # shift rest of longer list return(@zip); sub untangle { my (@nums) = @_; my @even = (); my @odd = (); foreach $num (@nums) { if ($num % 2) { push(@odd, $num); else { push(@even, $num); return(\@even, \@odd); 15

Aufgaben Miß die Laufzeit dieses Programms @a = (1..100000); foreach (1..100) { nop(@a); sub nop { my (@params) = @_; mit Hilfe von /usr/bin/time. Ändere das Programm so, daß das Array als Referenz übergeben wird. Wie ändert sich das Laufzeitverhalten des Programms? Erkläre das Ergebnis. teak:/homes/joern/lehre/perlpraxis03/perl6> /usr/bin/time passcopy.pl real 11.1 user 10.8 sys 0.1 teak:/homes/joern/lehre/perlpraxis03/perl6> /usr/bin/time passref.pl real 0.4 user 0.3 sys 0.1 16

Parameterübergabe revisited Welche Ausgabe erzeugt dieses Programm? Wieso? $p1 = $p2 = $p3 = call by value ; sub1($p1); sub2($p2); sub3(\$p3); print "$p1\n$p2\n$p3\n"; sub sub1 { $_[0] = call by reference ; sub sub2 { my ($param) = @_; $param = call by reference ; sub sub3 { my ($param_ref) = @_; $$param_ref = call by reference ; call by reference call by value call by reference 17

Modularisierung probiere folgendes Programm aus: say( Hello World ); package shouter; sub say { print uc($_[0]),"\n"; package whisperer; sub say { print lc($_[0]),"\n"; ersetze Aufruf durch shouter::say( Hello World ); bzw. whisperer::say( Hello World ); Undefined subroutine &main::say called at./say.pl line 3. 18

packages package definiert Namensraum: package shouter; $a = 20; sub say { print uc($_[0]),"\n"; print "a is $a\n"; package main; $a = 10; shouter::say( Hello World ); print "a is $a\n"; $a ist Paket-global HELLO WORLD a is 20 a is 10 19

Module wiederverwendbaren Code in eigene Datei auslagern Datei shouter.pm: package shouter; 1; sub say { print uc($_[0]),"\n"; Datei say.pl: use shouter; shouter::say( Hello World ); Versionierung: shouter.pm: $VERSION = 1.3 ; say.pl: use shouter 1.2; 20

Module, cont. Namen exportieren package shouter; require Exporter; @ISA = ("Exporter"); @EXPORT = ("say"); in say.pl say( Hello World ); require ähnlich zu use Vererbung durch @ISA Export von Symbolen sparsam einsetzen 21

das andere Perl-Motto Tugenden eines Programmierers: Laziness Impatience Hubris Faulheit Ungeduld Überheblichkeit 22