Siechfred: buchstaben- trigrame erzeugen

Beitrag lesen

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:

  • deklariere den Hash(!) %trigram_array außerhalb deiner while-Blöcke
  • schreibe die Daten in diesen Hash innerhalb des Blockes ohne my
  • ergänze in der foreach das my oder ändere es wie oben geschrieben

Siechfred

--
Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.