erstes pearl-"prog" anfängerhilfe

Dieses Thema im Forum "Mac OS Entwickler, Programmierer" wurde erstellt von banz, 09.09.2003.

  1. banz

    banz Thread Starter MacUser Mitglied

    Mitglied seit:
    26.05.2003
    Beiträge:
    406
    Zustimmungen:
    0
    hi, hoffe das Thema passt ungefähr hier rein.
    Habe ein Anfänger-Übungs-programm in Pearl "Geschrieben",
    Aufgabe:
    -Öffnen einer bestimmten Textdatei (.txt)
    -Zählen und Drucken der Zeichen
    -Zählen und Drucken der Wörter
    -Zählen und Drucken der Zeilen
    habe alles laut Anweisung gemacht, das mit den Zeichen und Wörtern funzt auch ganz gut, nur die Zeilen zählt er nicht richtig.
    Kann sich vielleicht jemand das Programm mal angucken und mir verraten wo ich mich vertippt habe? Wäre supernett.
     
  2. /etc

    /etc MacUser Mitglied

    Mitglied seit:
    21.08.2003
    Beiträge:
    137
    Zustimmungen:
    0
    gerne, aber wo ist ein Link dazu, oder hab ich das übersehen?
     
  3. banz

    banz Thread Starter MacUser Mitglied

    Mitglied seit:
    26.05.2003
    Beiträge:
    406
    Zustimmungen:
    0
    link? hab keinen Webspace, könnte dir das teilchen entweder schicken, oder den Text komplett hier posten(ist ja nicht so lang;)
     
  4. /etc

    /etc MacUser Mitglied

    Mitglied seit:
    21.08.2003
    Beiträge:
    137
    Zustimmungen:
    0
    ja, poste einfach mal, dann können auch noch andere daran teilhaben!
     
  5. banz

    banz Thread Starter MacUser Mitglied

    Mitglied seit:
    26.05.2003
    Beiträge:
    406
    Zustimmungen:
    0
    #!/usr/bin/perl -w

    # prog um Zeichen, W??rte und Zeilen einer .txt-datei zu z?§hlen
    $TheFile = "beispiel.txt";

    # Datei ??ffnen, falls vorhanden, oder prog schliessen
    open (INFILE, $TheFile) or die "Die Datei $TheFile konnte nicht gefunden werden.\n";

    # initialisieren der Z?§hlr
    $CharCount = 0;
    $WordCount = 0;
    $LineCount = 0;
    while(<INFILE>) {
    $TheLine = $_; # Zeileninhalt speichern
    chomp($TheLine); # Zeilenumbruch entfernen
    $LineCount = $LineCount + 1;
    $LineLen = length($TheLine);
    $CharCount = $CharCount + $LineLen;
    if($TheLine eq "") { next }; # Zeile ist leer, weiter
    $WordCount = $WordCount + 1; # Zeile hat mind. 1 Wort
    $CharPos = 0;
    until($CharPos == $LineLen)
    {
    if(substr($TheLine, $CharPos, 1) eq " ")
    { $WordCount = $WordCount + 1 }
    $CharPos = $CharPos + 1;
    } # Ende until-Schleife
    } # Ende while(<INFILE>)-Schleife

    # Ergebnis
    print "Fuer die Datei $TheFile:\n";
    print "Anzahl der Zeichen $CharCount\n";
    print "Anzahl der Woerter $WordCount\n";
    print "Zeilenanzahl $LineCount\n";
     
  6. banz

    banz Thread Starter MacUser Mitglied

    Mitglied seit:
    26.05.2003
    Beiträge:
    406
    Zustimmungen:
    0
    Sorry, issn bisken unübersichtlich angekommen und die Umlaute sind auch daneben, aber vielleicht geht`s auch so
     
  7. Descartes

    Descartes unregistriert

    Mitglied seit:
    14.12.2002
    Beiträge:
    189
    Zustimmungen:
    0
    Probiers mal etwas kürzer...

    PHP:
    #!/bin/perl
    #---------------------------------------------------------------------
    #
    use strict;
    use 
    warnings;
    use 
    diagnostics;
    #
    #---------------------------------------------------------------------
    #

    my$zeile, @dummy, @datei$datei_zeilen$datei_woerter$datei_zeichen );


    #
    # Datei 'beispiel.txt' oeffnen, in ein Array laden und Datei wieder schliessen
    #
    open(FILE"< beispiel.txt") or die("Fehler: $!\n");
    @
    datei = <FILE>;
    close(FILE);

    $datei_zeilen = $#datei + 1; # Anzahl Zeilen entspricht der Anzahl der Arrayelemente
                                 # Array beginnt bei 0, daher um 1 erhoehen

    #
    # Ueber jedes Arrayelement (= Zeile) iterieren...
    #
    foreach( @datei ) {
      
    $zeile $_;
      @
    dummy split(" "$zeile);         # aktuelle Zeile an den Leerzeichen aufsplitten und in ein Array speichern

      
    $datei_zeichen += length($zeile);    # Anzahl Zeichen entspricht der Stringlaenge
      
    $datei_woerter += ( $#dummy + 1 );   # Anzahl Woerter in der Zeile entspricht der Anzahl der Arrayelemente
                                           # Array beginnt bei 0, daher um erhoehen
    }

    printf("Anzahl Zeichen: %i\n"$datei_zeichen);
    printf("       Woerter: %i\n"$datei_woerter);
    printf("       Zeilen : %i\n"$datei_zeilen);

    __END__
     
  8. Descartes

    Descartes unregistriert

    Mitglied seit:
    14.12.2002
    Beiträge:
    189
    Zustimmungen:
    0
    PHP:
    while(<INFILE> ) {
        ...
        
    # diese Zeile wird nie abgearbeitet? Also weg damit
        
    if($TheLine eq "") { next }; # Zeile ist leer, weiter
        
    ...
    }

    PHP:
    while(<INFILE> ) {
        ...
        
    $WordCount += 1;
        
    $CharPos 0;
        
    until($CharPos == $LineLen)
        {
            if(
    substr($TheLine$CharPos1eq " ") { $WordCount $WordCount }
            
    $CharPos $CharPos 1;
        } 
    # Ende until-Schleife
        
    ...
    }
    das kann man kürzer schreiben:

    PHP:
    while(<INFILE> ) {
        ...
        
    $WordCount += 1;
        
    $WordCount += scalarsplit" "$TheLine ) );
        ...
    }
    Aber hierbei meckert Perl an, dass implizit generierte @_ Arrays nicht mehr verwendet werden sollen. Also sauberer programmieren und ein separates Array @TheWords verwenden:

    PHP:
    my( @TheWords );
    while(<
    INFILE> ) {
        ...
        
    $WordCount += 1;
        @
    TheWords split" "$TheLine );
        
    $WordCount += ( $#TheWords + 1 );
        
    ...
    }
     
  9. banz

    banz Thread Starter MacUser Mitglied

    Mitglied seit:
    26.05.2003
    Beiträge:
    406
    Zustimmungen:
    0
    oh man, danke

    für die schnelle und vor allem ausführliche Hilfe.
    ..auch wenn das Meiste noch wie "Bhf." für mich klingt.
    Das ist heute mein erster Tag mit Pearl, aber ich werd's schon noch lernen!!!!:rolleyes:
     
  10. Descartes

    Descartes unregistriert

    Mitglied seit:
    14.12.2002
    Beiträge:
    189
    Zustimmungen:
    0
    Für den Einstieg vielleicht ganz empfehlenswert:

    Einführung in Perl
    http://www.oreilly.de/catalog/einperl3ger/
    Randal L. Schwartz & Tom Phoenix
    Deutsche Übersetzung von Jørgen W. Lang
    3. Auflage Dezember 2001
    ISBN 3-89721-147-5
    Seiten 368
    EUR34.00, SFR57.90

    Oder gleich das Referenzwerk zu Perl von Larry Wall:

    Programmieren mit Perl
    http://www.oreilly.de/catalog/pperl3ger/
    Larry Wall, Tom Christiansen & Jon Orwant
    Deutsche Übersetzung von Peter Klicman
    2. Auflage Juli 2001
    ISBN 3-89721-144-0
    Seiten 1128
    EUR56.00, SFR89.90