Archiv verlassen und diese Seite im Standarddesign anzeigen : 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:
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";
}
$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:
$foo =~ s/^\W+(\w.*\w)\W+$/$1/g;
Ersetze einen String durch sich selbst ohne führende und abschliessende Leerzeichen.
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!
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.
#!/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";
}
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?
> 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:
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
Da gibt's noch ein Shellscript das Übersetzungen in ähnlicher weise macht(Deutsch/Englisch)
http://www.shelldorado.com/scripts/quickies/translate.txt
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
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?
> 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.
Hm. Irgendwie verstehn wir uns falsch :)
Also wenn in $_ beim Programmaufurf "fremdwort Dioxin" folgendes gespeichert ist
[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
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
print unless /langenscheidt/;
grundsätzlich NIE etwas zurückgeben.
Was verstehe ich hier falsch?
[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.
Uagh, natürlich. Es lautete ja while (<TEXT>) { ...}
Nun hab ich es begriffen, danke! :) :D :)
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.