Lina: buchstaben- trigrame erzeugen

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;

berechnet alle Trigramme (Buchstabenfolge der Länge 3) in einem ##Text und gibt diese mit Häufigkeit aus.

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";

  1. 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.
    1. Danke für gute Tipps. Mein Programm läuft! :)

      Gruß,
      Lina