1 Tagesüberblick 6 • Lösung Hausaufgabe/Fragen • Weitere besondere Variablen • Hier-Dokument • Unterprogramme
1
Tagesüberblick 6
• Lösung Hausaufgabe/Fragen
• Weitere besondere Variablen
• Hier-Dokument
• Unterprogramme
2
Weitere besondere Variablen
@ARGV # enthält alle Argumente die an das
# Programm übergeben wurden.
%ENV # enthält die Variablen des Environ- # ments. Schlüssel sind die
Variablen-
# namen, diese weisen auf die Werte.
3
@ARGV
# Programm aufrufen mit: test.pl Ich bin ein Test
foreach $arg(@ARGV){
print "#$arg\n"}
# liefert:
#Ich
#bin
#ein
#Test
4
%ENV
print join(",",keys(%ENV));
# obiger Einzeiler könnte z. B. liefern
# WINBOOTDIR,TMP,PROMPT,TEMP, ...
# COMSPEC,CMDLINE,PATH,WINDIR, ...
# BLASTER
5
Hier-Dokument
#!perl -w$a=<<BLA;Ich bin ein Text,der in einem Hier-Dokument gespeichert ist.BLAprint $a;
6
Programmausgabe
Ich bin ein Text,
der in einem Hier-
Dokument gespeichert
ist.
7
Hier-Dokument mit Variablen
#!perl -w$b=1745;
print <<BLA;Ich bin ein Text, der in einem Hier-Dokument gespeichert und mit Variablen angereichert ist.Z. B. $b ist eine schoene Zahl.BLA
8
Programmausgabe
Ich bin ein Text, der in einem Hier-Dokument
gespeichert und mit Variablen angereichert ist.
Z. B. 1745 ist eine schoene Zahl.
9
Aufgabe 6-1
• Schreiben Sie ein Programm, dass Sie mit Namen als Parametern aufrufen können.
• Geben Sie für jeden Namen eine Zeile aus:Hallo Name
• Wenn kein Parameter angegeben wurde, geben Sie aus:Hallo Ihr da!
10
Aufgabe 6-2
• Fragen Sie vom Benutzer seinen Namen, und sein Geburtsdatum ab. Geben Sie anschließend aus:
Ihr Name ist: NameIhr Geburtsdatum ist: Geburtsdatum
• Benutzen Sie hierzu eine einzelne Printanweisung mit einem Hier-Dokument
11
Aufgabe 6-3
• Schreiben Sie ein Programm, daß alle Environment-Variablen, die als Argument übergeben wurden, mit ihren Werten ausgibt,.
• Anmerkung: Beachten Sie den Sonderfall, daß nichts übergeben wurde. Hier geben Sie alle Environment-Variablen mit ihren Werten aus.
• Beispiel:test.pl COMSPECCOMSPEC=C:\WINDOWS\COMMAND.COM
12
Unterprogramme
sub beispiel{
print "Ein primitives Unterprogramm\n";
}
&beispiel;
&beispiel(12);
&beispiel(1+3,"Text"); # Es gibt keine Probleme
# falls man mehr Argumente als nötig übergibt
13
Argumente
sub printargs{ # Beachte:
print "@_;"; # Die Liste @_ hat
} # nichts mit der Variablen
# $_ zu tun und ist lokal
&printargs; # zum Unterprogramm
&printargs(12);
&printargs(1+3,"Text");
# liefert: ;12;4 Text;
14
Einzelne Argumente
sub print2args{ # Auch die einzelnen
print "$_[0] $_[1]\n"; # Listenelemente
} # $_[n] haben nichts
# mit $_ zu tun.
&print2args;
&print2args(12);
&print2args(1+3,"Text");
15
Explizite Rückgabesub maximum{
if ($_[0] > $_[1]){
$a=$_[0];
}
else{
$a=$_[1];
} # Der Rückgabewert
return $a; # wird nach dem
} # return übergeben
print &maximum(14,27)
16
Rückgabewert dirtysub maximum{
if ($_[0] > $_[1]){
$_[0]; # Der Rückgabewert
} # ist der jeweils
else{ # letzte evaluierte Wert.
$_[1]; # Diese Form findet man
} # gelegentlich vor.
} # Keinesfalls benutzen
print &maximum(14,27)
17
Frage:sub maximum{
if ($_[0] > $_[1]){
$a=$_[0]}
else{
$a=$_[1]}
print "$a\n";
}
print &maximum(14,27)
# Was wird ausgegeben?
18
Ergebnis
27
1
# Warum kam das heraus?
19
Lokale Variablensub enthalten{
my ($a, $b); # lokale Variable def.
($a, $b)=($_[0],$_[1]); # zuweisen
$a =~ s/\s//g; # \ whitespace
$b =~ s/\s//g; # / entfernen
return ($a =~ /$b/ | $b =~ /$a/); # enthalten ?
}
($a, $b) = ("a b c-Dur","b c");
if (&enthalten($a,$b)){print "enthalten:\n$a\n$b"}
20
Ergebnis:
enthalten:
a b c-Dur
b c
Dies zeigt deutlich, daß die Variablen $a und $b
im Unterprogramm von denen im Hauptprogramm
verschieden sind, sonst wären alle Leerstellen
verschwunden. Um dies zu verdeutlichen
schreiben Sie ein # vor das my und testen dann.
21
my <-> local
my Variablen sind immer lokal zu dem
Block in dem sie definiert sind. my ist
vorzuziehen, da schneller und sicherer
local Variablen sind lokal zu dem Block in
dem sie definiert sind und in von diesem
aufgerufenen Unterprogrammen
( geht nicht mit use strict )
( War vor PERL 5 üblich )
22
Merke
• Die Variablen des Programms sind global wenn nichts anderes vorgegeben ist.
• Ans Unterprogramm übergebene Variablen können von diesem verändert werden.
• Um zu vermeiden, daß bei späteren Programm-weiterentwicklungen Kuddelmuddel auftritt sollte man alle im Unterprogramm verwendeten, nicht übergebenen Variablen lokalisieren.
23
use strict
use strict; # jetzt müssen alle Variablen vor Ihrer
# Benutzung definiert werden
use vars qw($bb); # Global bekannt
{
my $aa; # Lokal bekannt
$aa=$bb=1;
print "$aa # ";
&bla;
}
sub bla{ print ++$bb}
# liefert: 1 # 2
24
Rekursion
sub rec{
if ($_[0] < 10){ # Immer auf Abbruch
print $_[0]++,"\n"; # achten!
&rec($_[0]); # Falls noetig
} # Schleifenzaehler
} # mitführen
$a=0;
&rec($a);
25
Aufgabe 6-4
• Lesen Sie die Datei daten6-1.txt ein.
• Wandeln Sie alle Klein- in Großbuchstaben um.
– Tun Sie dies in einem Unterprogramm.
• Geben Sie die Zeilen zunächst im Unterprogramm in Großbuchstaben aus.
• Geben Sie die Zeilen anschließend im Hauptprogramm im Original aus.
26
Aufgabe 6-5
• Erweitern Sie die im Beispiel genannte Maximumfunktion durch Verwendung der Rekursion auf beliebig viele Zahlen.
27
Aufgabe 6-6
• Schreiben sie ein Unterprogramm zur Berechnung der Fakultät
n!=1*2*3*.....*n
28
Hausaufgabe 6-1
• Lesen Sie die Datei daten5-3.txt ein.
• Die Datei enthält in einer Zeile Name, Vorname, Geschlecht und Alter einer Person, jeweils durch Schrägstrich (/) getrennt.
• Ermitteln Sie für jede Person die Fakultät des Alters. Benutzen Sie hierzu ein Unterprogramm.
• Ermitteln Sie die Mittelwerte der Fakultäten jeweils nach Geschlecht getrennt und geben Sie aus.