buchstaben- trigrame erzeugen
Lina
- perl
hallo,
ich will Buchstaben-trigrame aus dem Text erzeugen. Im Programm steckt etwas, das es nicht laufen lässt. Kann jemand ein Blick werfen und mir paar Tipps geben?
Danke.
Gruß,
Lina
#!/usr/bin/perl -w
use strict;
open (IN, "<te1.txt") or die "$!\n";
open (OUT,">te2.txt") or die "$!\n";
while (<IN>) {
my $line = $_; ## matches: Abc, abc, Äöü aber nicht: ABc, paß
while ( $line =~ /([A-ZÄÖÜa-zäöü])([a-zäöü][a-zäöü])(.*)/ ) {
my $first = $1;
$first =~ tr/A-ZÄÖÜ/a-zäöü/;
my $trigram = $first . $2;
my $trigram_array{$trigram}++ ;
$line = $2 . $3; ## ersten Buchstabe wegwerfen!
}
}
foreach $trigram (sort(keys(%trigram_array))) {
print $trigram_array{$trigram}, " ", $trigram, "\n";
}
close (OUT)or die "$!\n";
close (IN)or die "$!\n";
Im Programm steckt etwas, das es nicht laufen lässt. Kann jemand ein Blick werfen und mir paar Tipps geben?
Ich mag mir jetzt die dahintersteckende Logik nicht anschauen, aber du solltest dich mal mit lexikalischen Variablen und deren Gültigkeitsbereich befassen.
open (IN, "<te1.txt") or die "$!\n";
open (OUT,">te2.txt") or die "$!\n";
Hier beginnt ein Block. Alles, was darin steht, ist nur innerhalb des Blockes gültig.
while (<IN>) {
my $line = $_; ## matches: Abc, abc, Äöü aber nicht: ABc, paß
Hier beginnt ein weiterer Block. Alles, was darin steht, ist nur innerhalb dieses Blockes gültig.
while ( $line =~ /([A-ZÄÖÜa-zäöü])([a-zäöü][a-zäöü])(.*)/ ) {
my $first = $1;
$first =~ tr/A-ZÄÖÜ/a-zäöü/;
Zwischenbemerkung: Das geht auch als Einzeiler:
my $first = lc $1;
my $trigram = $first . $2;
my $trigram_array{$trigram}++ ;
Zwischenbemerkung: Bereits hier gibt's einen Syntaxerror, da nirgendwo ein Hash(!) deklariert wurde. Autovivikation funktioniert aber nur bei deklarierten Datenstrukturen.
$line = $2 . $3; ## ersten Buchstabe wegwerfen!
}
Blockende. Alle mittels my deklarierten Variablen sind im Datennirvana verschwunden.
}
Blockende. Alle mittels my deklarierten Variablen sind im Datennirvana verschwunden.
foreach $trigram (sort(keys(%trigram_array))) {
print $trigram_array{$trigram}, " ", $trigram, "\n";
}
Abgesehen davon, dass es foreach my $trigram heißen müsste (du arbeitest richtigerweise unter dem strict-Pragma) wirst du auch hier einen Fehler erhalten. Aber warum nicht ganz einfach:
foreach ( sort keys(%trigram_array) ) {
print $trigram_array{$_}, ' ', $_, "\n";
}
Nötige Korrekturen:
Siechfred
Danke für gute Tipps. Mein Programm läuft! :)
Gruß,
Lina