Anzeige:
Ergebnis 1 bis 12 von 12

Thema: Kleines Perl Problem

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.07.2002
    Beiträge
    17

    Kleines Perl Problem

    Guten Tag.

    Ich habe ein Problem mit dem untenstehenden Script.

    Mein Ziel ist es Fremdwort.de komfortabel über die Konsole
    abzufragen.

    Mein Problem ist:

    Die Ausgabe ist zershreddert, dh es werden WhiteSpace-Zeichen
    (sind DIESE Zeichen \s+?) vor und nach gestellt.
    Um diese zu entfernen probierte ich bereits folgendes:
    $foo =~ s/^\w+//g;
    $foo =~ s/\w+$//g;
    bzw
    $foo =~ /S+/sg;


    Allerdings änderte sich garnichts an der Ausgabe.

    Wie kann ich die Ausgabe nun 'sauber' bekommen?

    Hier der Code:

    Code:
    use LWP::Simple;
    use HTML::Entities qw (decode_entities);
    
    
    if ($ARGV[0] eq $ARGV[$#ARGV]) {
    
    
    my $html = get "http://www.langenscheidt.aol.de/cgi-bin/webquery.pl?key=$ARGV[0]
    &method=exact&x=39&y=9"; 
    
    $html = decode_entities($html);
    
    $html =~ s/<[^>]*>//gs;
    
    
    
    print $html;
    
    
    
    }
    else {
    
       die "Fehler: Bitte nur ein Fremdwort übergeben!\n";
    
          }

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    Code:
    $foo =~ s/^\w+//g;
    $foo =~ s/\w+$//g;
    bzw
    $foo =~ /S+/sg;
    Zeile 1: Ersetze eine am Anfang stehende beliebige Folge von Wortzeichen durch gar nix
    Zeile 2: Ersetze eine am Ende stehende beliebige Folge von Wortzeichen durch gar nix
    Zeile 3: Ersetze alle im String vorkommenden Nicht-Whitespace-zeichen oder Folgen davon durch garnix(wobei hier allerdings der 3. Slash fehlt.)

    Besser:
    Code:
    $foo =~ s/^\W+(\w.*\w)\W+$/$1/g;
    Ersetze einen String durch sich selbst ohne führende und abschliessende Leerzeichen.
    Geändert von fork (08-10-2002 um 17:15 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    26.07.2002
    Beiträge
    17
    Es funktioniet leider nicht. Könntest du das Script mal ausprobieren um zu überprüfen ob das wirklich WhiteSpace-Zeichen sind? Es ist mir unbegreiflich!

  4. #4
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    Die einfache Variante:

    Nimm die Zeile in der Du die HTML Tags filterst raus. Jag' den Output durch html2text(gibt's vielleicht sogar ein Modul für) fertig. Sieht besser aus als wenn Du es filterst.
    Code:
    #!/usr/bin/perl
    use LWP::Simple;
    use HTML::Entities qw (decode_entities);
    
    if ( $ARGV[0] eq $ARGV[$#ARGV] ) {
    
        my $html =
          get "http://www.langenscheidt.aol.de/cgi-bin/webquery.pl?key=$ARGV[0]
    &method=exact&x=39&y=9";
    
        $html = decode_entities($html);
    
        open( TEXT, "echo \"$html\" | html2text|" );
        while (<TEXT>) {
            print unless /langenscheidt/; # Die Webadresse im Ergebnis rausfiltern
        }
    
    }
    else {
    
        die "Fehler: Bitte nur ein Fremdwort übergeben!\n";
    
    }
    Geändert von fork (08-10-2002 um 19:38 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    26.07.2002
    Beiträge
    17
    Code:
    print unless /langenscheidt/; # Die Webadresse im Ergebnis rausfiltern
    DIese Zeile verstehe ich nicht in dieser speziellen Funktion. Das heisst doch "print $_, falls $_ NICHT auf das Musster zutrifft. Sprich wenn es nicht gefunden wird wird print durchgeführt, wenn doch dann eben nicht. Allerdings funktioniert es so nicht wie wir sehen. Wie kann es sein das diese Anweisung nun filtert? Steh ich aufm Schlauch?

  6. #6
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    > Allerdings funktioniert es so nicht wie wir sehen

    Hast Du Dir Verstärkung an den Rechner geholt ;-)

    Bei mir funktioniert das einwandfrei. Wenn ich das unless draussen
    lass dann sieht das so aus:
    Code:
    tobias@ax301:~> fremdwort Dioxin
    [http://www.germany.aol.com/cgi-bin/ivw/CP/langenscheidt]
      Dioxin das; -s,-e (chem.)polychlorierter Kohlenwasserstoff, hochgiftiges
             Verbrennungsprodukt
    tobias@ax301:~>
    Du hast das schon richtig erfasst; wenn "langenscheidt" nicht gefunden wird,
    was immer der Fall ist ausser in Zeile 1 wird $_ ausgegeben.

    Möglicherweise ist Das Programm html2text nicht installiert. Bei mir SuSE 7.3
    musste ich das Paket html2txt nachinstallieren. Man beachte das fehlende e
    im Paketnamen.

    fork

  7. #7
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    Da gibt's noch ein Shellscript das Übersetzungen in ähnlicher weise macht(Deutsch/Englisch)

    http://www.shelldorado.com/scripts/q.../translate.txt

  8. #8
    Registrierter Benutzer
    Registriert seit
    26.07.2002
    Beiträge
    17
    Fork du hast mich mißverstanden, vermutlich hab ich mich unpräzise ausgedrückt. Das Script funktioniert bei mir ebenso einwandfrei ich verstehe nur diese Zeile hier nicht

    Code:
    print unless /langenscheidt/; # Die Webadresse im Ergebnis rausfiltern
    Um genau zu sein verstehe ich nicht wieso hier gefiltert wird und nicht wie gewohnt abgefragt wird ob das Muster zutrifft oder nicht also printen ja oder nein. Statt dessen wird gefiltert... das ist das was ich nicht verstehe.

    Kannst du mir diesen Filterprozess hier erklären?

  9. #9
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444

    Smile

    > Statt dessen wird gefiltert... das ist das was ich nicht verstehe.

    Du hast das richtig verstanden. Meine Definition von Filter ist einfach etwas flexibler.
    Letztendlich ist diese ganze Schleife funktional einfach nur ein Filter, weil sie die URL
    rausfiltert.

  10. #10
    Registrierter Benutzer
    Registriert seit
    26.07.2002
    Beiträge
    17
    Hm. Irgendwie verstehn wir uns falsch

    Also wenn in $_ beim Programmaufurf "fremdwort Dioxin" folgendes gespeichert ist

    Code:
    [http://www.germany.aol.com/cgi-bin/ivw/CP/langenscheidt]
      Dioxin das; -s,-e (chem.)polychlorierter Kohlenwasserstoff, hochgiftiges
             Verbrennungsprodukt
    dann dürfte doch die Zeile

    Code:
    print unless /langenscheidt/;
    $_ nur printen, WENN /langenscheidt/ NICHT in diesem String enthalten ist. Aber da es ja grundsätzlich bei JEDEM Ergebnis enthalten ist dürfte
    Code:
    print unless /langenscheidt/;
    grundsätzlich NIE etwas zurückgeben.

    Was verstehe ich hier falsch?

  11. #11
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    Code:
    [http://www.germany.aol.com/cgi-bin/ivw/CP/langenscheidt]
      Dioxin das; -s,-e (chem.)polychlorierter Kohlenwasserstoff, hochgiftiges
             Verbrennungsprodukt
    Das sind drei Zeilen, jede ist ein element des Eingabedatenstroms.
    1. Zeile enthält langenscheidt -> wird nicht ausgegeben
    2. Zeile enthält langenscheidt nicht -> wird ausgegeben
    ...

    Der Angle-Operator(<TEXT>) liefert hier, im implizit skalaren Kontext(Das von while versorgte $_ ist ein Skalar) ein Element zurück. Elementtrenner ist newline.

  12. #12
    Registrierter Benutzer
    Registriert seit
    26.07.2002
    Beiträge
    17
    Uagh, natürlich. Es lautete ja while (<TEXT>) { ...}

    Nun hab ich es begriffen, danke!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •