Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines Perl Problem



poet
08-10-2002, 14:58
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";

}

fork
08-10-2002, 17:13
$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.

poet
08-10-2002, 18:47
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!

fork
08-10-2002, 19:31
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";

}

poet
09-10-2002, 04:00
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?

fork
09-10-2002, 17:54
> 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

fork
09-10-2002, 22:45
Da gibt's noch ein Shellscript das Übersetzungen in ähnlicher weise macht(Deutsch/Englisch)

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

poet
09-10-2002, 23:58
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?

fork
10-10-2002, 00:10
> 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.

poet
11-10-2002, 03:01
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?

fork
11-10-2002, 13:09
[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.

poet
11-10-2002, 14:25
Uagh, natürlich. Es lautete ja while (<TEXT>) { ...}

Nun hab ich es begriffen, danke! :) :D :)