PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script-Frischling und komplexer suchen/ersetzen-Script



14-05-2000, 17:39
Der Autor hat in ein HTML-Eingabefeld längeren HTML-formatierten Text eingetragen. Jedes enthaltene HTML-Tag soll eine im Algorithmus bekannte Script-action auslösen.

Der Einstieg will einfach nicht gelingen. Zunächst muss der Text durchsucht werden. Es wird also wohl in einer Schleife nach dem String "<*>" gesucht werden müssen? Beim Auffinden wird dann der genaue String ermittelt und mit einer Variablenliste verglichen.

Die Variablen könnte man alle in eine switch-Anweisung packen. Jeder case-Zweig enthält dann die auszuführende Befehlsfolge. Die default-Anweisung hätte die Aufgabe, das Tag zu löschen.

Wer kann etwas Start-Schützenhilfe geben oder gar was ausarbeiten, das wir dann ergänzen?

-- Ja ja http://www.linuxinfoserver.de/ubb/biggrin.gif , es ist für die Infiserver-db. Ich hab blackbird die (soweit ich konnte) verfollständigte und korrigiert Aufgabenliste (s. Mitgliederforum) gemailt - das meiste ist so geblieben. Gönnt ihm Schwimmbad und Grillabend http://www.linuxinfoserver.de/ubb/wink.gif . Er wird sich melden, sobald er die HP-Seite aktualisiert hat...

without Sonnenbrand

Bernhard

blackbird
14-05-2000, 22:45
hi omegaX!

du irrst dich, gleich 2mal http://www.linuxinfoserver.de/ubb/wink.gif ich meld mich bevor ichs aktualisiert hab (ist aber schon in vorbereitung) und ich bin leider nicht beim schwimmen, wir haben heut fenster gestrichen..

aber sonst kann ich ihm nur zustimmen! wir brauchen leute die mit perl gut umgehen können http://www.linuxinfoserver.de/ubb/wink.gif und ein php-ler wär auch ned verkehrt..
genaures gibts hier im mitgliederforum im thread zum linuxinfoserver oder unter http://www.dumdidum.de/linuxinfo.html

grüsse blackbird

15-05-2000, 00:02
Ist Masuchist ein Lehrberuf http://www.linuxinfoserver.de/ubb/wink.gif ? Muss doch gleich mal die Seite wieder laden. Vielleicht hat sich was neues ergeben?

Grüsse

Bernhard

robert
15-05-2000, 10:51
Hier mal als Schützenhilfe:



# Array of Text
@Text = ();

sub SearchText($Str)
{
$Str = shift;

foreach (@Text)
{
my $Line = $_;

if ( /.*?(\&lt;$Str\&gt; ).*/ )
{ return $1; }

}

return '';
}


Nur simple, aber so als Suchfunktion brauchbar...
@Text muß natürlich den Text enthalten und $Str den Suchstring (ohne &lt;&gt; ).
Man könnte auch die Zeilen-Nr. (bzw. den Text-Array Index) zurück geben, statt des Textes und diesen dann weiter verarbeiten...

Gruß

Robert

15-05-2000, 19:27
Der Trost: Das habt Ihr Spezialisten auch nicht in wenigen Wochen gelernt http://www.linuxinfoserver.de/ubb/wink.gif .

Dank Dir, Robert

Also, der Text muss als erstes eingelesen und an @Text übergeben werden. Da bräuchten wir noch was.

Vom Suchstring ist zunächst nur bekannt, dass er aus den beiden &lt;&gt; besteht und n noch unbekannte Zeichen enthält. Sobald solch ein Suchstring gefunden wird, wird er mit den Mustern verglichen. (Die Gross-und Kleinschreibung muss noch geklärt werden).

Die String-Operation muss sicher auch auf die Klammern durchgeführt werden. Die eigenen Tags veranlassen ja oft mehrere Operationen. Bei Löschungen sollen auf jeden Fall die Klammern mitgelöscht werden. -- Da Du die Klammern maskierst, könnten sie doch auch sicher Bestandteil von $Str sein?

Ist das jetzt Perl? Befehle wie foreach und konstante Variablen wie $Line hab ich in den Tutorials gar nicht entdeckt. Muss mir wohl doch so 'nen richtigen Perl-Wälzer zulegen.

Ist auf jeden Fall gut, dass die Funktion auch andere Parameter aus dem Text zurückliefern kann. Die Schnittstelle zur db kommt ja noch...

Brumm. Jetzt hab ich was leckeres und steh doch ganz am Anfang. Logo, ich hab mich im Moment viel zu weit vorgewagt. Aber egal, es soll ja weitergehen http://www.linuxinfoserver.de/ubb/biggrin.gif .

Gruss

Bernhard

christophwth
16-05-2000, 00:41
Hi

Ich mach gerade hardcoreprogrammieren *ggg*
C, Perl und C++ Windows Programmierung, Java parallel http://www.linuxinfoserver.de/ubb/wink.gif
Studium steßt ganz schön.
Aber ich habe mir Roberts kleine Funktion auch mal vorgenommen und versucht sie in eine
automatische Ersetzungsroutine einzubauen.
Aber ich bin in Perl doch noch nicht so fit.
Und er schmeißt mir immer Fehlermeldungen an den Kopf :-(
Deshalb meine Frage was erwartet @Text ? (ein Feld in einer Dimension beliebiger Länge mit allen Zeichen)?
Bin Dankbar für jede Erläuterung.

Wenn ich Perl weiter bin wollte ich eine Funktion programmieren die den Gesammten Inhalt
eines Verzeichnisses nach html durchsucht und die Dateien mit der Modifikation wieder abspeichert.
Ist das für uns von Nutzen ?

Bernhard ich hatte heute noch ne Web Adresse aus der Schweitz mit einen in deutsch gehatenen Tutorial.
Der Vorteil hier, bei weiteren Infos wird auf die umfangreichen englischen Perlpages verwiesen.
Ich werde, Die Adresse Noch mal heraussuchen und posten.

Bücher "OReily, Lerning Perl 2nd Edition "oder so änhlich
-in englisch, aber sehr gut für die Anfänge.

hihi : - brauchte nicht suchen, habe gerade noch einen Ausdruck gefunden und hier die ulr: http://www.fhzh.ch/bereich-technik/lehrtexte/tutorials/perl_tutorial/perl_start.html
dort steht auch my beschrieben.
usw.

Gruss
Christoph

16-05-2000, 05:49
Hi Christoph

Da hast Du ja volles Programm. Kein Wunder, dass es in Deiner Ecke so still ist (abgesehen von gründlichen Recherchen zu Grafikkarten und Einfriermäusen http://www.linuxinfoserver.de/ubb/wink.gif ).

Mein Tutorial war wirklich nur für den ersten Einstieg. Deine URL kommt da gerade richtig. Schon beim Laden hab ich Stringoperationen, foreach usw. entdeckt. Damit sollte ich weiterkommen.

> was erwartet @Text ?
Ich denk mal sowas in der Art:
@Text=("Damit sollte sich eigentlich schon arbeiten lassen");
Wir müssen aber in einer Variablen, also im Funktions-Return übergeben -> Ein Programm liest den String ein und übergibt in einer bestimmten Form. Genau diese Form ist dann in die Funktions-Klammern zu übernehmen.

Analog hierzu übergibt Robert in der Variablen $1.

Schlagt einfach, wenn es nicht stimmt. Aber um das umsetzen zu können, fehlt mir einfach noch die Programm-Kenntnis. Ohne die geht gar nichts.

Die Funktion, die Du programmieren willst, ist top. Sowas wird bei vielen Anlässen gebraucht. Angenommen, Du hast eine Anzahl HTML-files erstellt. Nun fällt Dir ein, Du willst mit CSS arbeiten... Muss ich weitersprechen? Wir werden die Funktion im Projekt gut zum Einsatz bringen können.

Also: Wer kann eine Funktion beisteuern, die aus einem Textfeld den String einliest und diesen in einer Variablen übergibt?

Ole, good learn, good hacks

Bernhard

robert
16-05-2000, 14:05
Hallo!




@DerText = ();
$FoundLine = -1;
$DateiName = "/tmp/meinedatei";

# Datei öffenen und bei Fehler Programm mit Fehlermeldung verlassen...
open(IFILE, "<$DateiName") | | die "Fehler beim öffnen von $DateiName\n";
# Datei-Text an Array DerText übergeben...
@DerText = &lt;IFILE&gt;;
close(IFILE);
$TextZeile = &SearchText;
if ( $TextZeile )
{
#mach was damit...
}
# Falls wir noch mal suchen wollen, Index wieder initilisieren...
$FoundText = -1;
# etc. pp.

###################

sub SearchText()
{
# Zeile für Zeile (oder Index für Index) aus DerText bearbeiten
foreach (@DerText)
{
my $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/.*?(\<.*?\>).*/ )
{
# $1 enthält das, was zwischen den () Klammern gefunden wurde.
return $1;
}
}

return '';
}


Kurze Anmerkung:
Ich könnte bei foreach auch folgendes schreiben.

foreach $Line (@DerText)

Aber da ich selber dann auch immer den Fehler mache, das ich evtl. $Line direkt bearbeite (was dann DIREKT im Array ist, den so wäre $Line eine DIREKTE Referenz zu dem Eintrag in @DerText), habe ich lieber aus $Line eine eigene locale Variable gemacht und übergebe dieser den jeweiligen Eintrag (my $Line = $_).
Zweites Problem ist natürlich die IF-Anweisung bei foreach. SO wird in einer Zeile nur der 1. TAG gefunden. Aber man kann es erweitern, daß man die Zeile vollständig bearbeitet bis alle TAG's gefunden werden.
Es wird auch nicht berücksichtigt, daß evtl. der TAG über mehrere Zeilen gehen könnte!

Übrigens, das hier so 1:1 übernehmen und ausführen wird nicht klappen. Es ist nur ein Beispiel an dem noch einges erweitert werden muss.

Gruß

Robert


[Diese Nachricht wurde von robert am 16. Mai 2000 editiert.]

robert
16-05-2000, 14:11
Nachtrag...

Beim suchen wäre folgendes wohl noch besser:



m/.*?(\b\<.*?\>).*/


\b bedeutet an einem Wortanfang (Wort darf man hier natürlich nicht so wörtlich nehmen... http://www.linuxinfoserver.de/ubb/smile.gif )

Robert

17-05-2000, 18:19
Mal so zwischendurch.

Die Funktion kann unterscheiden, ob sie Tags findet oder nicht.

...
if ( $TextZeile )
{
&nbsp;&nbsp;&nbsp;print "\n$1\n\n" ;
}
&nbsp;else
&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;print "\n Die Datei $DateiName enthält keine Tags.\n\n";
&nbsp;}
...

Das ist schon mal gut. Ich konnte sie noch nicht ausgeben lassen, was sie gefunden kat. Also weiterknobeln.

> m/.*?(\b\<.*?\>).*/
Bin noch nicht sicher, ob \b immer zum Ziel führt. Oft sind Tags direkt aneinander gehängt. Aber erst mal will ich rausfinden, was $1 überhaupt beinhaltet. Ich muss ja was konkretes sehen, um weiterarbeiten zu können.

Dank Dir Robert für diese leckere "Sprengkapsel". Ohne wäre lange Zeit gar nicht möglich gewesen. Soviel steht fest.

Christoph, ganz leckeres Tutorial. Scheint für Lehrzwecke geschrieben zu sein. Es befasst sich speziell mit der String-Manipulation. Der Text ist kompakt und verständlich. Es werden gezielt und dosiert auch englische Ausdrücke mit reingemischt. Von der Art gibt es sicher mehr. Sowas ist immer eine prima Referenz für die Linkliste. --

-- Wo ist die Db? Ich hab hier 10 MB Stoff auf der Platte. Das Zeug muss doch irgendwann mal aufgearbeitet werden. Bis Weihnachten kann ich nicht weitersammeln bei den vielen super Beiträgen. Irgendwann muss ich aufhören zu speichern. Die Foren-Suchmaschine werde ich später nicht mehr bedienen. ... Also... es werden noch viele kurztipfreudige, hackwütige, zeitverfügbare Hände benötigt. Müssen wir uns die jetzt in anderen Foren zusammensuchen http://www.linuxinfoserver.de/ubb/wink.gif ?

Bis zum nächsten Treffer (egal, wer ihn findet) http://www.linuxinfoserver.de/ubb/biggrin.gif

Bernhard

[Diese Nachricht wurde von Omega-X am 17. Mai 2000 editiert.]

christophwth
17-05-2000, 19:49
Hi

Leutz

Mein Kopf raucht ... Perl Perl Perl Perl RegExpresions Gr.... wer hilft mir ?
Robert Deine Regexpressions verstehe ich nicht so ganz m/.*?(\<.*?\>).*/ Hä ???
wieso Quittiert mir mein perl Programm die
Zeile immer mit ner Fehlermeldung.
Ansich habe ich die Regexpressions schon Verstanden. Aber was macht der Ausdruck ?
gibts unterschiede bei verschiedenen Compilern ? Ich stelle nämlich gerade Fest
unter Linux @Home funktioniert es.
Warum nicht auch auf der Unixkiste in der Uni.

Das ist schon Seltsam. Vielleicht klappt's
jetzt mit Linux.
Wenn ich das Programm so habe wie ich es mir vorgestellt habe poste ich es hier.

Gruss
Christoph

robert
17-05-2000, 23:56
Hallo Christoph,

laß den Kopf nicht rauchen. Ist wohl meine Schuld!

Die Anweisung

.*?

wird von älterem Perl nicht verstanden, ist eher eine Neuerung (aber schon bei 5.04).
Laß mal die Versions-Nummer von Perl auf der Uni raus, daran könnte es liegen.

.*

bedeutet kein oder beliebig viel Zeichen, dies können aber auch ALLE sein!

.*?

grenzt dies etwas ein und sagt Perl es soll nicht so gierig sein und nur beliebig viele, aber nicht unbedingt alle Zeichen nehmen, wenn danach noch nach etwas anderem gesucht wird.

Siehe auch in "Programmieren in Perl", zweite (deutsche) Auflage, Seite 31/32. http://www.linuxinfoserver.de/ubb/smile.gif

Gruß

Robert

P.S.
Übrigens, als gutes Einsteiger-Buch in Perl würde ich lieber "Einführung in Perl" (Randal Schwarz), ebenfalls von O'Reilly, empfehlen.

robert
18-05-2000, 00:11
Bernhard,

vorsicht!
Die $1 bezieht sich nur direkt auf das, was vorher in der RE gesucht wurde.
Soll heißen, die Klammern sind eine Art "Markierung" dafür, daß das was dazwischen gesucht/gefunden wurde, in der Variable $1 gespeichert wird.
Wenn du in der RE jetzt mehrere Klammern hast, wird von Links nach Rechts die Inhalte der Klammer-Markierungen in den Variablen $1..$n gespeichert. Dies ist aber nicht bei der Rückkehr der Funktion gesichert!!!
Du kannst statt $1 auch \1 als Backreferenz benutzen. Aber ich habe mir in Perl das $1 angewöhnt, da es besser in Perl paßt.
Wenn du eine Backreferenz aber direkt in der Suche benutzen willst, MUSST du sogar \1..\n nehmen!

Beispiel
m/\d*(\w*) \1/

Soll heißen, schaue, ob am Anfang keine oder beliebig viel Zahlen stehen (\d*) und merke dir danach (dafür die Klammern), wenn es vorkommt, ob kein oder beliebig viele Alpha-Numerische Zeichen (inkl. Unterstrich) vorkommen (\w*) und benutze diese gefundenen Alpha-Numerischen Zeichen nach dem nächsten Leerzeichen wieder als Such-String (Backreference = \1).
In diesem Fall MUSS man wie gesagt \1 als Backreference nehmen und darf nicht $1 benutzen.
Backreferences sind auch praktisch um einen String durch einen enthaltenen Teil-String zu ersetzen.
Beispiel:



$TestString = 'Dies ist ein Test für Backreference';

$TestString =~ s/.* (\bTest).*/$1/

print $TestString, "\n";


Und? Was kommt da bei raus??? http://www.linuxinfoserver.de/ubb/smile.gif

Wenn man direkt nach Klammern suchen will, muß man diese mit Backslash als Meta-Zeichen maskieren.

/\(.*\)/

Bei SED ist es wiederum anders, da muß man die Klammern mit Backslash maskieren, wenn man sie als Backreferens einsetzt.
Das hat mich am Anfang ganz schön durcheinander gebracht und ich habe es immer verwechselt... http://www.linuxinfoserver.de/ubb/smile.gif

Wenn du also oben nach dem Funktionsaufruf die Zeile bearbeiten willst, benutze die Index-Variable $FoundLine. Deshalb hab ich sie vorrausschauend hinzugefügt! http://www.linuxinfoserver.de/ubb/smile.gif



if ( $TextLine )
{
$ValueText = $DerText[$FoundLine];

# Mach was mit $ValueText...
}
else
{
print 'Nix gefunden', "\n";
}





Gruß

Robert

[Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]

[Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]

18-05-2000, 08:02
Haue, Haue, Haue - kein Wunder, dass sich da nur Script-Frischlinge (noch ahnungslos) und Spezialisten drantrauen. Spätestens nach Deinen Erklärungen lernt man Respekt. Die gehen aber auch schon satt ins Eingemachte.

Mir raucht der Kopf nicht vom Denken (das kommt erst allmählich mit rein), ich krieg den Drehwurm vom schnellen Probieren http://www.linuxinfoserver.de/ubb/biggrin.gif . Die Änderungen sind minimal und die Durchläufe blitzschnell. Und immer wieder was aus dem Tutorial nachvollziehen...

Hat jemand gesagt, C++ ist schwer? Kann gar nicht sein. Zumindest nicht, solange man sich halbwegs im "behüteten" Rahmen der Bibliotheken bewegt http://www.linuxinfoserver.de/ubb/biggrin.gif .

War jetzt echt Erholung, die paar Zeilen mal linear durchzuschreiben.

Und weiter geht's...

Bernhard

PS. Halt, nach dem Speichern erst mal wieder suchen/ersetzen spielen. Kfm ignoriert &lt;BR&gt; innerhalb von &lt;PRE&gt; . Irgendwann muss der Nachfolger doch fertiggebacken sein. Ich mag das Teilchen http://www.linuxinfoserver.de/ubb/rolleyes.gif .

robert
18-05-2000, 15:00
Christoph,

jepp... split ist die Lösung.

Beispiel:

In einer Text-Datei steht folgendes.

hans=ingo
jürgen=bernhard
robert=stefan

Wenn du dies jetzt, wie oben beschrieben, öffnest und an ein Array übergibst, enthätl jeder Array-Index eine Zeile.
Dann kannst du es wie folgt machen.



@SuchMich = ();
$MeineDatei = "/tmp/meinedatei";

open(INFILE, "< $MeineDatei") | | die "Konnte nicht öffnen\n";
@SuchMich = &lt;INFILE&gt;;
close(INFILE);

foreach (@SuchMich)
{
my ($Name1, $Name2) = split( /=/, $_);

print "Name 1: $Name1 gleich Name 2: $Name2\n";
}


Übrigens, der 1. Parameter von split ist auch nur eine RE!!!


Bernhard,

wußtest du, daß Perl angelehnt an der deutschen Sprache und deren Gramatik entwickelt wurde? http://www.linuxinfoserver.de/ubb/smile.gif
Perl ist sehr vielseitig und es gibt da einen "Spruch" zu Perl, schon fast ein Klassiker.

TMTOWTDI = There's More Than One Way To Do It !

Von Larry Wall

Gruß

Robert


[Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]

18-05-2000, 16:38
> 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%">
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&lt;
&lt;HTML&lt;
&lt;HEAD&lt;
&nbsp;&nbsp;&nbsp;&lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"&lt;
&nbsp;&nbsp;&nbsp;&lt;META NAME="GENERATOR" CONTENT="Mozilla/4.08 [de]C-DT (Win98; I) [Netscape]"&lt;
&nbsp;&nbsp;&nbsp;&lt;TITLE&lt;Linux Info Sammlung&lt;/TITLE&lt;
&lt;LINK rel=stylesheet type="text/css" href="formate.css"&lt;
&lt;STYLE type="text/css"&lt;
&lt;!--
... Extra-Style-Sheet-Angaben ...
//--&lt;
&lt;/STYLE&lt;
&lt;/HEAD&lt;
&lt;BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#3333FF" VLINK="#3333FF" ALINK="#66FFFF"&lt;

&lt;CENTER&lt;&lt;A NAME="1" .&lt;/a&lt;&lt;/A&lt;&lt;B&lt;&lt;FONT COLOR="#000099"&lt;&lt;FONT SIZE=+2&lt;Das
Programm cat&lt;/FONT&lt;&lt;/FONT&lt;&lt;/B&lt;&lt;/CENTER&lt;
(...usw.)
<HR ALIGN=LEFT WIDTH="100%">

Jetzt lass ich ausgeben, was die Subroutine einliest:

<HR ALIGN=LEFT WIDTH="100%">
sub SearchText()
{
&nbsp;# Zeile für Zeile (oder Index für Index) aus DerText bearbeiten
&nbsp;foreach (@DerText)
&nbsp;{
&nbsp;&nbsp;my $Line = $_;
&nbsp;&nbsp;&nbsp;print "$Line" ;
&nbsp;&nbsp;# Wir zählen mal den Index der gefundenen Zeilen mit (Array immer ab Index NULL!!!)
&nbsp;&nbsp;$FoundLine++; # Jetzt schreib ich es mal etwas ausführlicher und lesbarer...
&nbsp;&nbsp;if ( $Line =~ m/.*?(\b\&lt;.*?\&lt; ).*/ )
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;# $1 enthält das, was zwischen den () Klammern gefunden wurde.
&nbsp;&nbsp;&nbsp;&nbsp;return $1;
&nbsp;&nbsp;}
&nbsp;}

&nbsp;return '';
}
<HR ALIGN=LEFT WIDTH="100%">

Ausgabe:

<HR ALIGN=LEFT WIDTH="100%">
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&lt;
&lt;HTML&lt;
&lt;HEAD&lt;
&nbsp;&nbsp;&nbsp;&lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"&lt;
&nbsp;&nbsp;&nbsp;&lt;META NAME="GENERATOR" CONTENT="Mozilla/4.08 [de]C-DT (Win98; I) [Netscape]"&lt;
&nbsp;&nbsp;&nbsp;&lt;TITLE&lt;Linux Info Sammlung&lt;/TITLE&lt;
<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.]

blackbird
18-05-2000, 17:58
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 &lt;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 (http://download.macromedia.com/pub/dreamweaver/esd/dreamweaver3gtrial.exe) 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.]

robert
18-05-2000, 18:04
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.]

christophwth
18-05-2000, 21:51
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

robert
18-05-2000, 22:56
Christoph,

Bernhardt hat mir schon eine andere gemailt, hab es dahin per CC: geschickt...

Gruß

Robert

christophwth
19-05-2000, 00:15
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

19-05-2000, 03:33
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

christophwth
19-05-2000, 17:56
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) &#0124; &#0124; die "Fehler beim Öffnen von $indat" ;
# Zieldatei öffnen
open (OUTDAT,"> $outdat") &#0124; &#0124; 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/&/&amp;/g;
s/>/&gt;/g ;
s/</&lt;/g ;
s/\n/
\n/g ;
s/\344/&auml;/g;
s/\366/&ouml;/g;
s/\374/&uuml;/g;
s/\337/&szlig;/g;
s/\304/&Auml;/g;
s/\326/&Ouml;/g;
s/\334/&Uuml;/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

christophwth
19-05-2000, 18:05
Hi

peinlich peinlich Ich schreibe noch vorher was von Code und vergesse das in meinem Beispiel auch Html vorkommt. so soll es aussehen :


#!/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) &#0124; &#0124; die "Fehler beim Öffnen von $indat" ;
# Zieldatei öffnen
open (OUTDAT,"> $outdat") &#0124; &#0124; 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/&/&amp;/g;
s/>/&gt;/g ;
s/</&lt;/g ;
s/\n/
\n/g ;
s/\344/&auml;/g;
s/\366/&ouml;/g;
s/\374/&uuml;/g;
s/\337/&szlig;/g;
s/\304/&Auml;/g;
s/\326/&Ouml;/g;
s/\334/&Uuml;/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) &#0124; &#0124; die "Fehler beim Öffnen von $indat" ;
# Zieldatei öffnen
open (OUTDAT,"> $outdat") &#0124; &#0124; 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/&/&amp;/g;
s/>/&gt;/g ;
s/</&lt;/g ;
s/\n/
\n/g ;
s/\344/&auml;/g;
s/\366/&ouml;/g;
s/\374/&uuml;/g;
s/\337/&szlig;/g;
s/\304/&Auml;/g;
s/\326/&Ouml;/g;
s/\334/&Uuml;/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

christophwth
19-05-2000, 18:09
Hi
Ich bin zu blöde. schicks per mail.
CU
Christoph

20-05-2000, 02:52
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 &lt;PRE&gt;. 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.

robert
20-05-2000, 05:36
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

22-05-2000, 02:24
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

robert
23-05-2000, 14:25
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

24-05-2000, 06:10
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