PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RE in Perl wie gehts das



christophwth
22-05-2000, 20:40
Hi

ich wollte Folgendes in Perl rrogrammieren.
Zeilen einlesen,.. Teile der Zeile übernehmen.
und anhand einer zweiten Datei überprüfen
ob der gefundene String durch etwas anderes zu Ersetzten ist. Hoffe soweit war das Verständlich ?

Nun meim Problem, ich öffne beide Dateien.
Lese in der ersten, Zeile für Zeile ein über foreach und habe innerhalb dieser Schleife
eine Zweite Schleife die festellen soll ob es Übereinstimmungen gibt.
Die sieht folgendermaßen aus :

<PRE>
$passt=0;
for($lauf=0;$lauf<=$#arr+1 && $passt != 1 ;$lauf++)
{
($Name1, $Name2 )=split( / /, $arr[$lauf],2);
if ($Found =~ /$Name1/i)
{
$passt = 1;
print "replace in Line \t",$n ." gegen ".$Name1." ".$Name2;
}

</PRE>

Kann man das in Perl auch noch einfacher formulieren . Oder wo liegt mein Denkfehler
Die if Abfrage funktioniert nicht so wie ich mir das Vorgestellt habe.
Danke für jede Anregung.

Gruss
Christoph

22-05-2000, 21:53
Hi Christoph

Ich hab versucht, über if/elsif/else-Zweige einen Mustervergleich in Roberts Script einzufügen. Das spart den zweiten file. Kein Ergebnis bis jetzt. Probeweises Öffnen zum Schreiben hat erst mal mangels geeigneter Anweisung den file leergelöscht. So fängt das also auch meistens mit 'W' an.

Hier mein Ansatz:

<HR ALIGN=LEFT WIDTH="100%">
@mytag = ('&lt;I>', '&lt;K&gt;', '&lt;U1&gt;', '&lt;/U1&gt;');

if (/U1/) {
&nbsp;&nbsp;print "&lt;H2&gt;";
}
&nbsp;elsif (/\/U1/) {
&nbsp;&nbsp;&nbsp;print "&lt;/H2&gt;";
&nbsp;}
&nbsp;&nbsp;else (!$mytag) {
&nbsp;&nbsp;&nbsp;&nbsp;print "";
&nbsp;&nbsp;}
<HR ALIGN=LEFT WIDTH="100%">

Sowas in der Art muss doch in Roberts leckeren Basisscript reinzupfrimeln gehen? "Isch nem glei de Hommer, soviel hab isch schun gedeschdet http://www.linuxinfoserver.de/ubb/biggrin.gif ".

Gruss

Bernhard

[Dieser Beitrag wurde von Omega-X am 22. Mai 2000 editiert.]

christophwth
23-05-2000, 01:10
Hi

Bernhard das mit der If Anweisung habe ich ja gerade versucht zu Umgehen weil bei jeder Änderung ja das If Konstukt um ein elsif erweitert werden müßte deshalb habe ich etwas in dieser obig beschriebener Art versucht jetzt Funktioniert es auch, ich hatte
vergessen in der RE das ganze durch \b b\ (Wortgenze) abzugrenzen Deshabl hat er immer
Jedes Vorkommen ersetzt.
Bernhard bist du schon dahinter gekommen wie das mit dem Auffinden verschiedenster Tasks in einer Zeile funktioniert? Das ist eines meiner nächsten
Probleme, das gelöst werden will hier ein kleiner Ausschnitt

Die Datei ist folgendermaßen aufgebaut:
BR D
TABLE FOP
D TB
P G
TD TB
PRE FONT color "#998877"
/TABLE /PR

Hier wird das 1. Leerzeichen für split verwendent eine Schleife wird so lange durchlaufe wie nicht das Ende des Arrays und
nicht die richtige Position gefunden wurde.
Denn Fall das es keine Übereinstimmung gibt habe ich noch nicht berücksichtigt.

Hier der Ansatzt dazu, geht aber noch nicht wie gewünscht.

sub Arraysplit
{
LINE: foreach (@food) # Gehe der Reihe nach durch Zeilenweise bis \n
{
my $Zeile = $_;
chop($Zeile);
$n++;
# print $Zeile,"gezaehlt ",$n ,"\n";
if ( m/.*?\<(.*?)\>.*/)
####################################
# Look if it match with some Tasks #
####################################
{
$Found = $1;
# print $Found,"\n";
$passt=0;
for($lauf=0;$lauf<=$#arr+1 && ($passt != 1) ;$lauf++)
{
($Name1, $Name2 )=split( / /, $arr[$lauf],2);

# Suchmuster aus Tabelle uebernehmen
# ohne auf Gross und Kleinschreibung
# zu achten (RegExpression für if )

if ($Found =~ /\b$Name1\b/i) # Ausfiltern des Task von den Optionen
{
$passt = 1;
($part1, $part3) = split( />/,$Zeile,2);
$part2=$1;
print $Zeile,"PArt", $part2. "w w".$part1;
# print $part3;
# print "replace in Line \t",$n." " .$Name1." gegen ".$Name2;
}
else
{
$part2="";
$passt = 0;
}
}
das 2. split funktioniert noch nicht wenns gehen sollte dann wollte ich das Ganze mit dem Ersetzen zurückschieben. in ein ZielArray
das in Roberts Art und Weise ausgegeben wird.
Dabei ist natürlich auch eine Ausgabe in eine
Datei möglich. Fertig ist die primitive "Umwandlungsmaschine"

"good hacks "

Gruss
Christoph

23-05-2000, 03:46
Hi Christoph

Also Roberts Script printet alle Tags von einer Zeile, nur eben untereinander. Hab das jetzt noch mal explizit überprüft. Du verwendest doch die gleiche Einlese-Methode.

Deinen Script kann ich praktisch nicht nachvollziehen. Die vielen Kürzel, plötzlich auftauchende Variablen... ich kann nur raten, welche Aufgabe die haben http://www.linuxinfoserver.de/ubb/rolleyes.gif . Ich seh nur, dass Du alles in einer einzigen geschachtelten Anweisung geschrieben hast. Die fehlenden schliessenden geschweiften sind sicher ein Übertragungsfehler... Leider. Hier geht erst mal nichts mehr.

--Scheinbrar bringt es nichts, den file komplett einlesen zu lassen und nach Mustervergleich alle Funde gezielt ersetzen zu lassen?

> ...Fertig ist die primitive "Umwandlungsmaschine"
Hauptsache, sie erfüllt ihre Aufgabe. Wenn alles mal läuft, kann man sich ggf immer noch eine Steigerung ausdenken. Dann ist vielleicht doch direkte HTML-Eingabe möglich.

Gruss

Bernhard

christophwth
24-05-2000, 00:14
Hi

Bernhard ich werde dir sobald ich etwas weiter bin das fertige, lauffähige Programm per mail schicken. Dann kannst Du nach Herzenlust ausprobieren. Das letzte Posting sollte nur ein Ansatz sein es stellt
eine kleine Funktion dar. Allerdings fehlen am Ende ein paar Klammern, wie Du schon richtig bemerkt hattest. Die Programmierer die das
lesen dürfen mich schlagen, Globale Variablen
in 2 Funktionen benutzt. "-was sind Übergaben http://www.linuxinfoserver.de/ubb/wink.gif -Variablen erst bei Benötigung deklariert bzw. initialisiert."
Wie man sieht ein ganz schlechter Programmierstill http://www.linuxinfoserver.de/ubb/wink.gif.
ich Fange mal an meine Gedankengänge etaws zu erläutern: Bsp:
for($lauf=0;$lauf<=$#arr+1 && ($passt != 1) ;$lauf++)
Die oben erwähnten TaskTexte
BR D
TABLE FOP
zum Beispiel sollen Durchsucht werden. Dafür
benötige ich eine Laufvariable die nenne ich jetzt $lauf und initialisiere sie mit 0.
Laufbedingung Solange noch nicht das Ende erreicht ist ($lauf<=$#arr+1) und auch die Position nicht gefunden wurde ($passt != 1).
Dann kommen die folgenden Zeilen ins Spiel
($Name1, $Name2 )=split( / /, $arr[$lauf],2);
Angefangen bei Zeile 0 (BR D)wird der rechte und linke Teil jeweis in einer Variablen gespeichert. Dann wird Verglichen ob in der Zeile :
if ($Found =~ /\b$Name1\b/i) # Ausfiltern des Task von den Optionen
über einstimmungen sind wenn ja ist die Suche
beendet und es wird mit der nächsten Eingabezeile im Htmltext weiter gemacht.
Der nachfolgende Teil ist nur weitere Spielrei von mir die noch nicht funktioniert.

Gruss
Christoph

24-05-2000, 06:08
Momentan geht ja richtig was ab.

Hi Christoph

Ein klein wenig verständlicher ist es jetzt schon geworden. Ist halt ein sehr mühsamer Weg. Scheinbar lässt sich $Zeile nicht als Array darstellen? Dann müsste sich auf der Basis der Übereinstimmung die Anfangs- und End-Position vom gefundenen $1-String ermitteln lassen. Die Positionen werden gelöscht, die Ersetzung wird eingefügt. Erst danach wird geprüft, ob die Zeile weitere Tags enthält, usw. - Das war jetzt die versprochene verrückte Idee http://www.linuxinfoserver.de/ubb/biggrin.gif .

Dabei fällt mir ein, vielleicht sind Leerzeichen am Anfang oder/und am Ende von $Name das Problem?
> if ($Found =~ /\b$Name1\b/i)
Du hast \s nirgends mit eingebaut. Aber wie? \s kann den Nicht-Tag-String einleiten/beenden oder nicht.

Ich glaub, wenn die Nuss geknackt ist, lohnt es sich, zumindest die sub ans Perl-Team zu beamen. Wenn das in die Bibliotheken mit eingebaut wird, sollte Stringmanipulation richtig schön werden http://www.linuxinfoserver.de/ubb/biggrin.gif . Ist es nicht?

--Mit "testen" meinte ich nicht "Nachtesten, was ohnehin läuft". Das grosse Knobeln geht doch weiter... Auf jeden Fall freu ich mich schon jetzt auf die Etappensieg-mail http://www.linuxinfoserver.de/ubb/biggrin.gif .

Gruss

Bernhard