Perl Programmierung - Grundkurs
Textdatei auf dem Bildschirm ausgibt. Es ist möglich, mit einer Anweisung auszukommen.
Übung 3: Duplikate
Schreiben Sie ein Programm, das alle Wörter einer Textdatei auflistet, die genau zweimal vorkommen. Der Name der Textdatei soll als Argument in der Kommandozeile angegeben werden.
Lösungsblatt 3
Lösung zu Übung 1: Zuweisen
my @Liste = (1,2,3);
my @Liste2 = ("Eins","Zwei","Drei");
my $Scalar1 = "Hallo";
my $Scalar2 = "Fertig";
my @neue_liste = @Liste;
@neue_liste = reverse(@Liste[1,2]); # 3 2
@neue_liste = ($Scalar1, @Liste[1,1]); # Hallo 2 2
@neue_liste[2,1,3] = @Liste[1,2,1]; # Hallo 3 2 2
@Liste=(@Liste,4); # 1 2 3 4
my($Dummy, $Ergebnis) = @Liste; # 1, 2
$Ergebnis = @Liste; # 4
($Ergebnis) = @Liste2; # Eins
($Ergebnis) = @Liste[1..2]; # 2
$Ergebnis = $Liste2[$Liste[$Liste[0]]]; # Drei
$Ergebnis=$Liste2[3]; # undef
my %hash = (@Liste,5); # 1=>2,3=>4,5=>undef
@Liste = undef; # (undef)
Lösung zu Übung 2: Zeilenzahl
print scalar(my @liste = <>),"\n";
1. Schritt: Einlesen der Datei in eine Liste
my @liste = <>;
2. Schritt: Bestimmen der Anzahl der Elemente in der Liste
my $anzahl = scalar(@liste);
3. Schritt: Ausgeben der Anzahl
print $anzahl,"\n";
Kopieren Sie jetzt den ersten Schritt in den zweiten und diesen in den letzten, dann bleibt eine einzige Anweisung.
Wenn Sie nicht auf einer Anweisung bestehen, können wir eine Lösung mit zwei Anweisungen formulieren, die viel weniger Speicherplatz braucht. Dazu lesen wir Zeile für Zeile, ohne uns überhaupt für das Ergebnis zu interessieren. Trotzdem wird der interne Zeilenzähler $. aktualisiert. Das ist eine von Perl vordefinierte Variable, die Sie bereits in den Übungsaufgaben kennen gelernt hatten.
while (<>) {}
print "$.\n";
Stattdessen hätten wir natürlich auch einen eigenen Zähler definieren können.
my $no=0;
while (<>) {++$no}
print "$no\n";
Lösung zu Übung 3: Duplikate
#!/usr/bin/perl -w
use strict;
# Hash fuer die Worte anlegen
my %wort_anzahl;
while (<>) # Einlesen in $_
{
my @F = split; # In Worte zerlegen
for my $wort (@F) {
++$wort_anzahl{$wort};
}
}
while (my ($key,$wert) = each %wort_anzahl)
{
if ($wert == 2) { print "$key\n"; }
}
__END__
Testdaten
das das der der der
die er er die er das
Übungsblatt 4
Übung !: Wie oft?
Wie oft werden die folgenden Anweisungen ausgeführt?
for (my $no1=0; $no1 < 5; ++$no1) {
for (my $no2=0; $no2 < 3; ++$no2) {
print "wie oft?";
}
}
for (my $no1=0; $no1 < 3; ++$no1) {
for (my $no2=0; $no2 < $no1; ++$no2) {
print "wie oft?";
}
}
for (my $no1=0; $no1 < 3; ++$no1) {
for (my $no2=0; $no2 >= $no1; ++$no2) {
print "wie oft?";
}
}
Übung 2: Bis dahin
Schreiben Sie ein Programm, das alle Zeilen einer Textdatei auf dem Bildschirm ausgibt, bis eine Zeile mit dem folgenden Aufbau in der Datei gefunden wird:
__END__
Es soll also das Wort __END__ am Anfang einer sonst leeren Zeile stehen. Die abschließende Zeile selbst soll nicht ausgegeben werden.
Den Namen der Datei übernehmen Sie wie gewohnt als Argument in der Kommandozeile.
__END__ ist ein reserviertes Wort in Perl, das bewirkt, dass der Rest der Datei ignoriert wird. Sie können so zum Beispiel Testdaten im Programmtext selbst unterbringen.
Lösungsblatt 4
Lösung zu Übung 1:
for (my $no1=0; $no1 < 5; ++$no1) {
for (my $no2=0; $no2 < 3; ++$no2) {
print "wie oft?"; # 15 Mal
}
}
Die Schleife wird 15-mal ausgeführt. Wenn Sie zwei Schleifen ineinander schachteln, von denen die erste 5-mal und die innere Schleife 3-mal ausgeführt wird, dann bekommen Sie 3*5, also 15 Durchläufe. Nur der Deutlichkeit halber sei es gesagt: Das gilt nicht, wenn Sie die Schleifen nacheinander ausführen, also zuerst
Weitere Kostenlose Bücher