-
> Warum einfach, wenns auch mit Perl geht
Whel Christoph.
Sieger kann sein, wer nach "Algorithmus" lebt http://www.linuxinfoserver.de/ubb/biggrin.gif :
Den Spass finden, auch wenn's stupide langweilig oder irre komplex ist,
Das Jagdfiber entdecken,
Auf die Pirsch gehen.
In dieser Heihenfolge. Bin bereits bei Schritt drei.
Prima, dass wir rein zufällig an verschiedenen Fronten angreifen.
Ich bin beim zeilenweisen Einlesen. Hier ein Auszug aus einer HTML:
<HR ALIGN=LEFT WIDTH="100%">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"<
<HTML<
<HEAD<
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"<
<META NAME="GENERATOR" CONTENT="Mozilla/4.08 [de]C-DT (Win98; I) [Netscape]"<
<TITLE<Linux Info Sammlung</TITLE<
<LINK rel=stylesheet type="text/css" href="formate.css"<
<STYLE type="text/css"<
<!--
... Extra-Style-Sheet-Angaben ...
//--<
</STYLE<
</HEAD<
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#3333FF" VLINK="#3333FF" ALINK="#66FFFF"<
<CENTER<<A NAME="1" .</a<</A<<B<<FONT COLOR="#000099"<<FONT SIZE=+2<Das
Programm cat</FONT<</FONT<</B<</CENTER<
(...usw.)
<HR ALIGN=LEFT WIDTH="100%">
Jetzt lass ich ausgeben, was die Subroutine einliest:
<HR ALIGN=LEFT WIDTH="100%">
sub SearchText()
{
# Zeile für Zeile (oder Index für Index) aus DerText bearbeiten
foreach (@DerText)
{
my $Line = $_;
print "$Line" ;
# Wir zählen mal den Index der gefundenen Zeilen mit (Array immer ab Index NULL!!!)
$FoundLine++; # Jetzt schreib ich es mal etwas ausführlicher und lesbarer...
if ( $Line =~ m/.*?(\b\<.*?\< ).*/ )
{
# $1 enthält das, was zwischen den () Klammern gefunden wurde.
return $1;
}
}
return '';
}
<HR ALIGN=LEFT WIDTH="100%">
Ausgabe:
<HR ALIGN=LEFT WIDTH="100%">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"<
<HTML<
<HEAD<
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"<
<META NAME="GENERATOR" CONTENT="Mozilla/4.08 [de]C-DT (Win98; I) [Netscape]"<
<TITLE<Linux Info Sammlung</TITLE<
<HR ALIGN=LEFT WIDTH="100%">
Wer hat der Funktion gesagt, dass sie nach 6 Zeilen keine weiteren Zeilen mehr
einlesen soll? Ich sehe keine Hinweis. Die Nuss sollte natürlich mit Priorität
geknackt werden. Leider komm ich hier keinen Schritt mehr weiter.
Robert, aus dem Spruch ergibt sich auch der hohe Schwierigkeitsgrad von Perl. Kurz und lecker gesagt.
blackbird, Algorithmen-Spezialist: Knobelst Du im Background am Preventivschlag http://www.linuxinfoserver.de/ubb/biggrin.gif ?
Gruss
Bernhard
[Diese Nachricht wurde von Omega-X am 18. Mai 2000 editiert.]
-
hi bernhard!
da muss ich leider passen, mit perl hab ich mich noch nicht beschäftigt - leider. ich kann mir zwar auf die meisten zeilen in robert´s scripten nen reim machen, aber auch nur da, wo´s in klartext steht. wo´s intressant wird, beissts aus, wer hätts gedacht.
weiss auch nicht ob ich demnächst zeit hab mich da reinzulesen, bin ja nach wie vor in meiner weiterbildung. und da machen wir jetzt 4 wochen novell - absolutes neuland. und hinterher soll ich mich dann cna schimpfen. naja wartens wir ab..
aber ich les da grad <META NAME="GENERATOR" CONTENT="Mozilla/4.08 [de]C-DT (Win98; I) [Netscape]".
da drehts mir ja den magen um. nicht wegen win win98, das lass ich mir ja gefallen. aber seiten mit dem netscape composer? *hmmm* geh doch ma auf http://macromedia.com/ und lad dir den dreamweaver 3 runter. das ist n wirklich gutes teilchen ;D mach schlanken code, und kann eigentlich alles was man braucht. und noch n bissl mehr http://www.linuxinfoserver.de/ubb/wink.gif
so genug off-topic.
ich kann dir beim perl-problem leider auch nicht weiterhelfen..
grüsse blackbird
[Diese Nachricht wurde von blackbird am 18. Mai 2000 editiert.]
-
Bernhard,
ich hatte ja schon oben geschrieben, dies sind NUR Beispiele, aber so werden sie nicht funktionieren! http://www.linuxinfoserver.de/ubb/smile.gif
Aber damit euch nicht die Köpfe explodieren kommt was per Mail... http://www.linuxinfoserver.de/ubb/smile.gif
Gruß
Robert
P.S.
Christoph, hast du keine Mail-Adr.???
[Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]
-
Hi
Robert Meine E-mail Adresse müßte jetzt sichtbar sein.
Danke noch mal für Deine Anregungen. Da habe ich ja wieder viel zum ausprobieren.
Ich habe den Thread erst mal gespiechert und
werde in der nächsten freien Zeit mal weiter
tüfteln.
Naja, das Wetter ist ja auch nicht mehr so, daß man die gesammte Zeit am Strand liegen muß. http://www.linuxinfoserver.de/ubb/wink.gif
Hallo Bernhard Ich habe mir Dein Html
Beispiel mal angeschaut die Tasks hast Du
alle so " < <" dargestellt weil Du keinen UBB Code verwenden wolltest ? http://www.linuxinfoserver.de/ubb/wink.gif
Falls nicht, geht das Skript natürlich nicht http://www.linuxinfoserver.de/ubb/wink.gif
ich habe mal versucht Das Suchen/Ersetzten
auf die folgende Weise zu programmieren.
s/RE/Ersetzung/gi
Wobei die letzten Beiden ,g für alle Vorkommen steht. und i, ignore Case (Groß und Kleinschreibung egal ).
Gruß
Christoph
-
Christoph,
Bernhardt hat mir schon eine andere gemailt, hab es dahin per CC: geschickt...
Gruß
Robert
-
Hi
Robert, danke für deine Erleuterungen.
Da hätte ich ja lange suchen http://www.linuxinfoserver.de/ubb/wink.gif.
Wenn irgent was nicht funktioniert such man den Fehler meist bei sich selbst, Und nicht in der Perlversion. Das scheint wohl die Ursache gewesen zu sein.
Ich habe mir zum Thema Suchen/Ersetzen mit Perl noch mal was überlegt Ich wollte das so machen, daß ich ein Array benutze in dem zu Erst der zu suchende Begriff steht und dann der zu ersetzenden Begriff, und das Zeile für Zeile. Aber in Perl ist das so das bei einer über ein HANDLE geöffneten Datei die an ein Array zugewiesen wird. Die Felder immer durch das Zeilenende-Zeichen gebildet werden. Korrigiert mich wenn ich falsch liege. " Lösung (splitt) ?"
...Bernhard, das ist Perl!! Warum einfach, wenns auch mit Perl geht http://www.linuxinfoserver.de/ubb/wink.gif Ich mußte mir
das mit $1 und dem System Variablen auch mehrmals durchlesen. Aber viel schlauer bin ich auch noch nicht geworden.
Aber auch ich laß mich durch kleine Ungereimtheiten
nicht aus dem Konzept bringen. http://www.linuxinfoserver.de/ubb/wink.gif
Gruss
Christoph
-
Nee blackbird,
das ist mir spontan als Gruss eingefallen. Hast schliesslich schon sehr viel getan für das gute Klima und handfeste Hilfe in den Foren - logo allemal zum Projekt.
Weiterbildung hat immer Priorität. Ausserdem macht Mitlesen und schmunzeln bestimmt auch mal Spass!? http://www.linuxinfoserver.de/ubb/biggrin.gif -- ABER ICH LES WOHL NICHT RICHTIG?: Der Spezialist, der stolz ist auf sein selbstkreiertes SoundScript und sich bedenkenlos an getdaily getraut hat, ist nicht der ausgekochte Scriptspezialist aus dem FF? Also hatte ich mit "Algorithmenspezialist" doch recht. Denn den zu finden bedeutet den halben Sieg.
Dank Dir für den Tip. War unbekannt und wird natürlich gecheckt. (Ich hab es Robert schon gemailt: Heute werde ich mir wohl die brandneue Distri holen. Dann werden bei mir hoffentlich nicht mehr Netz und Winschrott in einer Zeile stehen müssen http://www.linuxinfoserver.de/ubb/biggrin.gif .)
Ist richtig Christoph, maskieren liegt locker in der Hand, während ich mit UBB noch nicht so gute Ergebnisse hatte. Die HTML ist natürlich original und nicht maskiert. Du siehst das an der Ausgabe: Die hab ich auch maskiert.
--Kaum bist Du am "profgesteuerten" Lernen, schon versteh ich Deine Ansätze nicht mehr. Die Ergebnisse werden aber studierbar sein http://www.linuxinfoserver.de/ubb/biggrin.gif .
Danke Robert nochmal für die leckere Büroklammer-mail. Ich staun immer wieder, dass Du bei Deinem weiten Aufgabenfeld immen noch Zeit und Musse findest, uns Frischlingen unter die Arme zu greifen und an leckeren Projekten mitzupfrimeln. Der Name kann nur "Passion" sein.
Gruss
Bernhard
-
Hi
Wie? Bernhard Du verstehts meine Ansätzte nicht. Meinst Du das mit :
s/Was wird gesucht/was ist zu ersetzen/g; in Perl. Ich zeige Dir mal ein kleines Skript das so, vom Linux Magazin stammt. Das Skript soll eine Datei öffenen und diese in Html
verwandeln, wobei natürlich die Sonderzeichen
mit umgewandelt werden müssen:
#!/usr/bin/perl
{
print "Originaldatei: "; chop ($indat = <STDIN>);
print "Neue Datei: "; chop ($outdat = <STDIN>);
print "HTML - Dokumenttitel:"; chop ($titel = <STDIN>);
# Quelldatei öffnen
open (INDAT,$indat) | | die "Fehler beim Öffnen von $indat" ;
# Zieldatei öffnen
open (OUTDAT,"> $outdat") | | die "Fehler beim Öffnen von $outdat";
# HTML Kopf schreiben
print OUTDAT "<HTML>\n" ;
print OUTDAT "<TITLE>$titel</TITLE>\n<BODY>\n";
while ( <INDAT> ) { # Quelldatei einlesen und via Regexp ändern
s/&/&/g;
s/>/>/g ;
s/</</g ;
s/\n/
\n/g ;
s/\344/ä/g;
s/\366/ö/g;
s/\374/ü/g;
s/\337/ß/g;
s/\304/Ä/g;
s/\326/Ö/g;
s/\334/Ü/g;
print OUTDAT ;
}
# HTML Fuß schreiben
print OUTDAT "
<HR>\n";
print OUTDAT "converted by ascii2html.pl\n";
print OUTDAT "</BODY>\n</HTML>\n";
close (INDAT); # Quelldatei schliessen
close (OUTDAT); # Zieldatei schliessen
}
-----------------------cut --------------
Außerdem habe ich mir Dein Beispiel noch mal angeschaut. Es stimmt tatsächlich, er bekommt nur 6 Zeilen zu fassen ob wohl dort steht
foreach (@DerText)
{
my $Line = $_;
print "$Line" ;
$FoundLine++;
usw.
Drehe ich den Vergleich um Zählt er wieder
alle 17 Zeilen die durch \n abgeschlossen wurden. Anscheinend bewirkt der Ausdruck
if ( $Line =~ m/.*?(\b\<.*?\< ).*/ )
Was ganz Spezielles
Aber was ?
Danke Robert für deine Mail. ich Habe das Skript natürlich auch gleich ausprobiert. Und würde sagen es funktioniert.
Aber was macht man damit Wenn man die Seite nachher wieder in den Originalzustand bringen
will. Dann müßten redundante Informationen
eigentlich entfert werden. Aber woher weiß ich dann an welcher Stelle die Informationen
Redundant sind. Ich denke Da habe ich noch richtig viel zu bedenken.
Gruß
Christoph
-
Hi
peinlich peinlich Ich schreibe noch vorher was von Code und vergesse das in meinem Beispiel auch Html vorkommt. so soll es aussehen :
Code:
#!/usr/bin/perl
{
print "Originaldatei: "; chop ($indat = <STDIN>);
print "Neue Datei: "; chop ($outdat = <STDIN>);
print "HTML - Dokumenttitel:"; chop ($titel = <STDIN>);
# Quelldatei öffnen
open (INDAT,$indat) | | die "Fehler beim Öffnen von $indat" ;
# Zieldatei öffnen
open (OUTDAT,"> $outdat") | | die "Fehler beim Öffnen von $outdat";
# HTML Kopf schreiben
print OUTDAT "<HTML>\n" ;
print OUTDAT "<TITLE>$titel</TITLE>\n<BODY>\n";
while ( <INDAT> ) { # Quelldatei einlesen und via Regexp ändern
s/&/&/g;
s/>/>/g ;
s/</</g ;
s/\n/
\n/g ;
s/\344/ä/g;
s/\366/ö/g;
s/\374/ü/g;
s/\337/ß/g;
s/\304/Ä/g;
s/\326/Ö/g;
s/\334/Ü/g;
print OUTDAT ;
}
# HTML Fuß schreiben
print OUTDAT "
<HR>\n";
print OUTDAT "converted by ascii2html.pl\n";
print OUTDAT "</BODY>\n</HTML>\n";
close (INDAT); # Quelldatei schliessen
#!/usr/bin/perl
{
print "Originaldatei: "; chop ($indat = <STDIN>);
print "Neue Datei: "; chop ($outdat = <STDIN>);
print "HTML - Dokumenttitel:"; chop ($titel = <STDIN>);
# Quelldatei öffnen
open (INDAT,$indat) | | die "Fehler beim Öffnen von $indat" ;
# Zieldatei öffnen
open (OUTDAT,"> $outdat") | | die "Fehler beim Öffnen von $outdat";
# HTML Kopf schreiben
print OUTDAT "<HTML>\n" ;
print OUTDAT "<TITLE>$titel</TITLE>\n<BODY>\n";
while ( <INDAT> ) { # Quelldatei einlesen und via Regexp ändern
s/&/&/g;
s/>/>/g ;
s/</</g ;
s/\n/
\n/g ;
s/\344/ä/g;
s/\366/ö/g;
s/\374/ü/g;
s/\337/ß/g;
s/\304/Ä/g;
s/\326/Ö/g;
s/\334/Ü/g;
print OUTDAT ;
}
# HTML Fuß schreiben
print OUTDAT "
<HR>\n";
print OUTDAT "converted by ascii2html.pl\n";
print OUTDAT "</BODY>\n</HTML>\n";
close (INDAT); # Quelldatei schliessen
close (OUTDAT); # Zieldatei schliessen
} close (OUTDAT); # Zieldatei schliessen
}
CU
Christoph
-
Hi
Ich bin zu blöde. schicks per mail.
CU
Christoph
-
Christoph, ich hab solche Sachen gemeint > s/RE/Ersetzung/gi. Damit kann ich nichts anfangen.
Mit der Darstellung des Scripts hättest Du Dir gar nicht so viel Mühe machen brauchen http://www.linuxinfoserver.de/ubb/biggrin.gif . Es kommt doch erst mal auf die Befehlszeilen an. -- Dank Dir für die mail. Im Texteditor kommt der Aufbau am besten http://www.linuxinfoserver.de/ubb/wink.gif . Code-Tag schreibt übrigens nichts anderes als <PRE>. Irgendwie scheint das nicht immer so zu klappern, wie man will. Ich hab im letzten Posting einfach mal die HTML-Tags und die vorangestellten Leerzeichen maskiert. Das geht schnell, das Layout ergibt sich automatisch.
Dein Script... klar werde ich mit dem expirimentieren. Verstanden hab ich ihn nicht. ZB die Zahlen. --- Aber Unterricht wär zu viel Aufwand. Learning by doing.
Robert, dank Dir noch mal für den "Nachschlag" als zip. Logo klappt das. Ich muss beim Testen des Scripts allerdings erst mal einen Fehlschlag verbuchen: Er beginnt mit dem Einlesen der Tags und verwendet dauer-power Prozesslast. Der Prozess wird dann ohne Ausgabe gekillt. Der Prozessor ist dann allerdings immer noch stark beschäftigt. Der Grund könnte sein, dass im Testfile Tags über zwei zeilen liegen. Wenn das der Grund ist, nützt auschecken gar nichts, Tags wie Font-Tags und andere können jederzeit auf zwei Zeilen liegen. Das kannn man bei der Autoreneingabe nicht ausschliessen.
Der Script hat damit natürlich nicht verloren sondern die Möglichkeit, formatierten Text eingeben zu können. Das meint, der Autor muss PlainText eingeben und unsere Tags verwenden. die sind ohne Leerzeichen und stehen somit immer in einer Zeile. Sieht erst mal so aus, als ob es gar nicht anders geht. Der Autor muss das unmissverständlich wissen, denn sonst schafft er dieses Prozesslast-Problem (falls es bei mit nicht einen anderen Grund hat. Ich werde das noch versuchen zu checken).
Fazit: Bei den Scripten werde ich im Wesentlichen nur Testarbeiten, Logik und verrückte Ideen http://www.linuxinfoserver.de/ubb/biggrin.gif beisteuern können. Das sollte aber auch schon helfen können. Autodidaktisch braucht Perl einfach seine Zeit. Ich tu aber, was geht. Der Db-Job fasziniert mich. Wirklich mal bei einem Projekt in der Grössenordnung dabei zu sein, das ist schon 'ne tolle Sache (abgesehen vom Ziel, dass sehr nützlich sein wird) http://www.linuxinfoserver.de/ubb/biggrin.gif .
So manches, was wir hier brauchen, ist bereits in den Foren-Scripten enthalten. Ich hab vor kurzem gepostet, dass ich nicht weiss, wie man sie läd. Falls doch mal jemand Lust hat, mich aufzuklären oder mir die Teilchen beamt - ich hab keine Hemmungen, mich in komplexen Sachen zu orientieren. Entweder finde ich Lösungen oder Ideen. Beides wird nützlich sein...
Gruss
Bernhard
PS. Robert, Deine letzte mail ist nicht ignoriert und nicht verloren gegangen (s.o.). Vor allem am Wochenende schreibt halt der "Krümel" seine Prioritäten http://www.linuxinfoserver.de/ubb/biggrin.gif . Ich meld mich aber noch mal.
-
Christoph,
das Script filtern NUR die TAGS aus und speichert diese im Array @TAGS.
Mehr macht es nicht, mehr wollte ich damit auch nicht bezwecken. Sondern nur zeigen wie man es machen KÖNNTE! Als Basis!
Die Original-Datei ist ja im Array @HtmlText vorhanden.
Wenn man jetzt z.B. die TAGS nicht in ein Array, sondern in ein Hash speichert und als Hash die Zeilen-Nummer der Html-Datei, soll heißen der Index von @HtmlText, angibt, kann man das wieder rendundant zurückbringen, aber dabei die TAG's ändern oder anpassen.
Ich gebe nur Beispiele, ich habe nichts fertiges gegeben... http://www.linuxinfoserver.de/ubb/smile.gif
Bernhard,
das Problem was du beschreibst liegt höchstwahrscheinlich in einer Endlos-Schleife, was ich auch im Script mit Kommentaren versucht habe als Problem zu beschreiben.
Wenn HTML Kommentare verzwickt und verschachtelt mit HTML TAGs liegen, geht das Script in die Hose. So weit habe ich es nicht ausgearbeitet...
Ich habe nur versucht Standardfälle zu umgehen.
Wie gesagt, das muß noch sehr weit ausgearbeitet werden und ist nicht so simple, vor allem wenn man jeden Fall beachten will.
Soll heißen, man muß schon einen kompletten Parser schreiben, wenn es Hand und Fuß haben soll. Und der ist nicht mit ein paar Zeilen geschrieben!
Gruß
Robert
-
Die Endlosschleife basierte auf stehengelassenen Tagklammern. Dadurch ergab sich ein verschachteltes Tag in einer Zeile. Wenn in einer Zeile neben Tags aber nur grösser-als- oder kleiner-als-Pfeile stehen, ist das kein Problem. Der Zuweisungs-Operator zB muss also nicht maskiert werden http://www.linuxinfoserver.de/ubb/biggrin.gif . Tags, die über zwei Zeilen gehen, werden einfach nicht berücksichtigt. Was haltet ihr davon, konkret nur PlainText nebst unserer Tags einzugeben? Das würde doch den Aufwand ungemein reduzieren.
Nachdem alle Tags sauber eingelesen werden, hab ich versucht, probeweise mal ein bestimmtes Tag umzuformen. Nirgends konnte ich entsprechenden Kode einfügen. Immer wurden explizit packages verlangt. Lässt sich die Umwandlung nicht gleich beim Einlesen realisieren? Die Ausgabe ist ja eigentlich Nebensache und erfolgt nur zu Testzwecken.
Gruss
Bernhard
-
Hallo Bernhard!
Das mit den explizit Packages liegt an den am Anfang gesetzten
use strict "subs";
use strict "vars";
Das mache ich aus Sicherheit... http://www.linuxinfoserver.de/ubb/smile.gif
Du mußt alle lokalen Variablen mit my $Varible definieren und Funktionen mit &Funktion aufrufen!
http://www.linuxinfoserver.de/ubb/smile.gif
Gruß
Robert
-
Dank Dir Robert,
für die Info. Hab inzwischen auch gemerkt, dass bei richtiger Deklaration die Fehlermeldungen unterbleiben http://www.linuxinfoserver.de/ubb/biggrin.gif . Die waren halt zuerst etwas irreführend. Auf jeden Fall läuft der Script incl. Christohps sub. Alle Tags (auch wenn mehrere in einer Zeile stehen), werden ausgegeben.
Hab aber dann nicht weiter geknobelt. Hab gestern vor allem mal blackbirds "Bestellung" fertiggemacht. Wir brauchen ja wirklich mal ein Eingabe-Formular im Layout. Ich werde dann drangehen, die Aufgaben der Tags zunächst mal im Algorithmus zusammenzustellen. Dann kann man den Script weiter ausbauen...
...und an alle. Sobald blackbird das Teilchen auf der HP hat, schaut bitte nach, wie das Layout unter den eigenen Bedingungen kommt. Ich hab die TEXTAREA genau so gross gemacht, dass sie in der Höhe genau ins kfm-Fenster passt. Die Area soll nicht höher sein als das Browser-Fenster. Dann braucht beim "Texten und Dichten" http://www.linuxinfoserver.de/ubb/biggrin.gif nur in der Area gescrollt werden. Für alle, die Java-Script aktiviert haben, ist auch die komplette Tag-Auswahl incl Einfüge-Button ohne Scrollen verfügbar. - Und bitte "motzt" kräftig, wenn Euch irgendwas auffällt http://www.linuxinfoserver.de/ubb/wink.gif . Wir sollten von einer Ecke her mal versuchen, eine Linie reinzubringen.
Gruss und gute Hacks
Bernhard