1-4. Frage
Lösung
~ $ wget "http://gutenberg.spiegel.de/buch/5560/1" -O 1.html ~ $ wget "http://gutenberg.spiegel.de/buch/5560/2" -O 2.html ~ $ wget "http://gutenberg.spiegel.de/buch/5560/3" -O 3.html ~ $ wget "http://gutenberg.spiegel.de/buch/5560/4" -O 4.html ~ $ ~ $ lynx -dump -assume_charset=UTF-8 -hiddenlinks=ignore -nolist -verbose 1.html 2.html 3.html 4.html > bibel.txt
5. Frage
Lösung
#!/usr/bin/perl # Programm start: perl -C datei_name.perl # Aufgabe 12.5 # Datei: aufg_12_5.perl # Die ersten 4 Bucher Moses runterladen und in die Datei "bibel.txt" zusammenfügen use strict; use warnings; my $bibel=""; my $anzahl_buecher =4; for(my $i=1; $i<=$anzahl_buecher; $i++){ my $url ="wget \"http://gutenberg.spiegel.de/buch/5560/$i\" -O $i.html"; system($url); my $fileIn = "temp.txt"; system("lynx -dump $i.html -assume_charset=UTF-8 -hiddenlinks=ignore -nolist -verbose > $fileIn"); open(IN, "<:utf8", $fileIn) or die "Datei $fileIn nicht gefunden!\n"; undef $/; my $buch=<IN>; close(IN); system("rm $fileIn"); # Die nächsten Zeilen sind optional. # Ich lösche die unnötigen Informationen der Internetseite. $buch =~ s/^.+$i\. Buch Mose//s; # Den Header löschen my $next = $i+1; my $back = $i-1; $buch =~ s/Kapitel $next >>.*//s; # Den Footer löschen $buch =~ s/<< Kapitel $back.*//s; # Den Footer löschen $buch = "\n$i. Buch Mose".$buch; # Ende optional $bibel = $bibel.$buch; } print $bibel; # Aufrum im Terminal: perl -C aufg_12_5.perl > bibel.txt # ODER # Datei "bibel.txt" im Program erzeugen #open(OUT, ">:utf8", "bibel.txt"); #print(OUT $bibel); #close(OUT);
6-9. Frage
Lösung
#!/usr/bin/perl # Programm start: perl -C datei_name.perl use strict; use warnings; use utf8; # Aufgabe 12.6 # Eine sortierte Frequenzliste aller Wörter aus der Datei "bibel.txt" erzeugen. my($inFile, $line, @words, $word, %wordlist); $inFile = "bibel.txt"; open (IN,$inFile) or die "File $inFile not found!"; while($line = <IN>) { chomp($line); @words = split(/[\p{Z}\p{P}]+/,$line); foreach $word (@words) { if ($word ne "") { $wordlist{$word}++; } } } close(IN); # Aufgabe 12.7 # Anzahl unterschiedlicher Wörter in der Bibel my @sorted_words = sort {$wordlist{$b} <=> $wordlist{$a}} keys %wordlist; my $numder_dif_words = scalar @sorted_words; print "In der Bibel sind $numder_dif_words unterschiedlicher Wörter.\n"; # Aufgabe 12.8 # Die 10 wichtigsten(häufigsten) großgeschriebenen Wörter my $counter = 0; print "Die 10 wichtigsten(häufigsten) großgeschriebenen Wörter sind:\n"; foreach $word (@sorted_words) { if ($word =~ /^\p{Lu}/){ print "$wordlist{$word}: $word\n"; $counter++; } last if ($counter == 10); } # Aufgabe 12.9 # Was sind die 10 wichtigsten(häufigsten) kleingeschriebenen Wörter? print "Die 10 wichtigsten(häufigsten) kleingeschriebenen Wörter sind:\n"; $counter = 0; foreach $word (@sorted_words) { if ($word =~ /^\p{Ll}/){ print "$wordlist{$word}: $word\n"; $counter++; } last if ($counter == 10); }
10. 15. 16. Frage
Lösung
#!/usr/bin/perl # Programm start: perl -C datei_name.perl use strict; use warnings; use utf8; # Aufgabe 12.10 # das längeste Wort, das in der Bibel vorkommt my($inFile, $line); my $longestBibelWord = ""; my $nr_of_words = 0; $inFile = "bibel.txt"; open (IN,$inFile) or die "File not found!"; while($line = <IN>) { chomp($line); my $longestLineWord = &longest_word($line); $longestBibelWord = $longestLineWord if (length($longestLineWord) > length($longestBibelWord)); $nr_of_words += &count_words($line); } close IN; print "In der Bibel sind insgesamt $nr_of_words Wörter.\n"; print "Das längste Wort (mit ".length($longestBibelWord)." Buchstaben) ist \"$longestBibelWord\".\n"; # Aufgabe 15 sub longest_word($){ # Ermittelt das längste Wort einer Zeile, wobei im Wort nur Buchstaben vorkommen dürfen. my $zeile = $_[0]; # INPUT: Eine Textzeile als Skalar: $zeile my $max = ""; my @words = split(/[\p{Z}\p{P}]+/,$zeile); my $word; foreach $word (@words){ if ( ($word =~/^\p{L}+$/) && (length($word) > length($max)) ){ $max = $word; } } return $max; # RETURN: Das Wort mit den meissten Buchstaben } # Aufgabe 16 sub count_words($){ # Ermittelt die Anzahl der Wörter in eine Zeile my $zeile = $_[0]; # INPUT: Eine Textzeile als Skalar: $zeile my @words = split(/[\p{Z}\p{P}]+/,$zeile); return scalar(@words); # RETURN: Die Anzahl der Wörter in der Zeile }
ODER
#!/usr/bin/perl # Programm start: perl -C datei_name.perl use strict; use warnings; use utf8; # Aufgabe 12.10 # das längeste Wort, das in der Bibel vorkommt my $inFile = "bibel.txt"; open (IN,$inFile) or die "File not found!"; undef $/; my $text_in_line = <IN>; close IN; my $longestBibelWord = &longest_word($text_in_line); my $nr_of_words = &count_words($text_in_line); print "In der Bibel sind insgesamt $nr_of_words Wörter.\n"; print "Das längste Wort (mit ".length($longestBibelWord)." Buchstaben) ist \"$longestBibelWord\".\n"; # Aufgabe 15 sub longest_word($){ # Ermittelt das längste Wort einer Zeile, wobei im Wort nur Buchstaben vorkommen dürfen. my $zeile = $_[0]; # INPUT: Eine Textzeile als Skalar: $zeile my $max = ""; my @words = split(/[\p{Z}\p{P}]+/,$zeile); my $word; foreach $word (@words){ if ( ($word =~/^\p{L}+$/) && (length($word) > length($max)) ){ $max = $word; } } return $max; # RETURN: Das Wort mit den meissten Buchstaben } # Aufgabe 16 sub count_words($){ # Ermittelt die Anzahl der Wörter in eine Zeile my $zeile = $_[0]; # INPUT: Eine Textzeile als Skalar: $zeile my @words = split(/[\p{Z}\p{P}]+/,$zeile); return scalar(@words); # RETURN: Die Anzahl der Wörter in der Zeile }
11. 12. Frage
Lösung
#!/usr/bin/perl # Programm start: perl -C datei_name.perl use strict; use warnings; use utf8; # Aufgabe 12.11 # Dem Satzendeerkenner den Text aus der Datei geben # und aus dem zurückgegebenen Text die Datei "bibel_satzend.txt" erstellen (Copy/Paste aus Browzer in Editor.) # Aufgabe 12.12 # die 10 häufigsten Wörter am Satzanfang aus der Datei "bibel_satzend.txt" my %wordlist; my $inFile = "bibel_satzend.txt"; open (IN,$inFile) or die "File $inFile not found!"; undef $/; my $text =<IN>; close(IN); $text =~ s/\n/ /g; # Newlines durch Space erzetzen $text =~ s/\s+/ /g; # Multiple Space durch ein Space ersetzen my @sätze = split("{eos}", $text); foreach my $satz (@sätze){ if ($satz =~/^\s*(\p{L}+)\b/) { $wordlist{$1}++; } } my @sortierte_wörter = sort {$wordlist{$b} <=> $wordlist{$a}} keys %wordlist; print "\nDie 10 häufigsten Wörter am Satzanfang aus der Datei \"bibel_satzend.txt\".\n"; for(my $i=0; $i<10; $i++){ print "$wordlist{$sortierte_wörter[$i]}: $sortierte_wörter[$i]\n"; }
13. Frage
Lösung
#!/usr/bin/perl # Programm start: perl -C datei_name.perl # PERL-Programm, das die ersten 3 Zeilen eines jeden Kapitels von jedem Buch ausgibt. # Die Ausgabe soll folgende Form haben $inFile = "bibel.txt"; open (IN,$inFile) or die "File not found!"; my $counter = 0; while($line = <IN>) { chomp($line); if ( ($line =~ /[1-4]\. Buch Mose/) || ($line =~ /Kapitel \p{N}+/) ){ print "$line\n"; $counter = 0; next; } $counter++ if ( $line =~ /^\p{Z}*\p{N}\./ ); print "$line\n" if ( ($counter <= 3) && ($line ne "") ); } close(IN);
14. Frage
Lösung
#!/usr/bin/perl # Programm start: perl -C datei_name.perl use strict; use warnings; use utf8; # Aufgabe 12.14 # morpholgischen Varianten des Wortes Herr. # wie oft die verschiedenen Varianten des Wortes Herr vorkommen. my($inFile, $line, @words, $word, %wordlist); $inFile = "bibel.txt"; open (IN,$inFile) or die "File not found!"; while($line = <IN>) { chomp($line); @words = split(/[\p{Z}\p{P}]+/,$line); foreach $word (@words) { if ($word =~/^Herr/i) { $wordlist{$word}++; } } } my @sortedWords = sort {$wordlist{$b} <=> $wordlist{$a}} keys %wordlist; print "Morpholgischen Varianten und die Häufigkeit des Wortes \"Herr\":\n"; foreach $word (@sortedWords){ print "$wordlist{$word}: $word\n"; } close(IN);
Hier die ganze Aufgabe 12 als ein Perl-Programm.
#!/usr/bin/perl use strict; use warnings; use utf8; { ################## ###Texte holen ################## for (my $i = 1; $i <= 4; $i++){ system("wget -O $i.html http://gutenberg.spiegel.de/buch/5560/$i"); system("lynx -dump $i.html -hiddenlinks=ignore -nolist -verbose > bibel$i.txt"); } system("cat bibel*.txt >> bibel.txt"); ################## ###Variablen deklarieren und Dateien öffnen ################## my ($line,@words,$word,%lexikon,@lexikon_sortiert,$anzahl,$longest_word_in_line,$anzahl_woerter); my $longest_word = ""; open(IN, "<utf8:", "bibel.txt"); open(OUT, ">utf8:", "statistik.txt"); ################## ###Hash erstellen und sortieren ################## while($line = <IN>){ chomp($line); if ($line =~ /\p{L}/){ # $longest_word_in_line = &longest_word($line); # $anzahl_woerter = &count_words($line); # #print "Anzahl Wörter pro Zeile: $anzahl_woerter\n\n"; # if (length($longest_word_in_line) > length($longest_word)){ # $longest_word = $longest_word_in_line; # } @words = split(/[\p{Z}\p{P}]+/,$line); foreach $word(@words){ if ($word =~ /\p{L}/){ $lexikon{$word}++; } } } } # print "Längstes Wort in der Bibel: $longest_word\n\n"; # print OUT "Längstes Wort in der Bibel: $longest_word\n\n"; @lexikon_sortiert = sort {$lexikon{$b} <=> $lexikon{$a}} keys %lexikon; ################## ###Anzahl unterschiedlicher Wörter ermitteln ################## $anzahl = scalar(@lexikon_sortiert); print "Anzahl unterschiedlicher Wörter: $anzahl\n\n"; print OUT "Anzahl unterschiedlicher Wörter: $anzahl\n\n"; ################## ###Die 10 häufigsten großgeschriebenen Wörter ermitteln ################## print "Die 10 häufigsten großgeschriebenen Wörter:\n"; print OUT "Die 10 häufigsten großgeschriebenen Wörter:\n"; my $zaehler = 0; foreach $word(@lexikon_sortiert){ if ($word =~ /^\p{Lu}/){ print "$word\n"; print OUT "$word\n"; $zaehler++; } if ($zaehler == 10){ last; } } ################## ###Die 10 häufigsten kleingeschriebenen Wörter ermitteln ################## print "\nDie 10 häufigsten kleingeschriebenen Wörter:\n"; print OUT "\nDie 10 häufigsten kleingeschriebenen Wörter:\n"; $zaehler = 0; foreach $word(@lexikon_sortiert){ if ($word =~ /^\p{Ll}/){ print "$word\n"; print OUT "$word\n"; $zaehler++; } if ($zaehler == 10){ last; } } ################## ###Datei mit den end-of-sentence-Tags öffnen und in eine skalare Variable einlesen ################## open(EOS, "<utf8:", "eos.txt"); $/ = undef; $line = <EOS>; $/ = "\n"; ################## ###Hash aller Wörter an Satzanfängen erstellen und die 10 häufigsten ausgeben ################## my %satzanfänge; while($line =~ /\{eos\}.+?([\p{L}\p{N}]+)\b/gs){ $satzanfänge{$1}++; } my @satzanfänge_sortiert = sort {$satzanfänge{$b} <=> $satzanfänge{$a}} keys %satzanfänge; print "\nDie 10 häufigsten Satzanfänge:\n"; print OUT "\nDie 10 häufigsten Satzanfänge:\n"; $zaehler = 0; foreach $word(@satzanfänge_sortiert){ print "$word\n"; print OUT "$word\n"; $zaehler++; if ($zaehler == 10){ last; } } close(IN); close(EOS); close(OUT); } ################## ###Subroutinen ################## sub longest_word($){ my $zeile = shift(@_); my $longestword= ""; my ($word,@words); @words = split(/[\p{Z}\p{P}]+/,$zeile); foreach $word(@words){ if ((length($word) > length($longestword))&&($word =~ /^\p{L}+$/)) { $longestword = $word; } } return ($longestword); } sub count_words($){ my $zeile = shift(@_); my @words = split(/[\p{Z}\p{P}]+/,$zeile); my $anzahl_woerter = scalar(@words); return $anzahl_woerter; }