Bernhard Peissl: Ärgerliches if-statement

Hallo!

Jetzt, wo sich mein Projekt dem Ende zuneigt(ihr habt also bald wieder Ruhe von mir), scheinen Die Errors nur so aus dem Boden zu schiessen: Hier was ganz blödes, und ich komm einfach nicht dahinter warums nicht funktioniert:

my $ansprechpartner_text = "";
[...]
sub getStaff {
open (GET_STAFF, "mitarbeiter.info") die "can't open mitarbeiter.info: $!\n";
while ($line=<GET_STAFF>) {
  chomp($line);
  ($staff_id, $staff_name, $staff_aufgaben, $staff_tel, $staff_fax, $staff_email, $dummy) = split(/::/,$line);

if ($staff_id eq $lva_ansprechpartner1 $staff_id eq $lva_ansprechpartner1) {
   $ansprechpartner_text .= "<p>\n".$staff_name." <!--".$staff_id."-->\n";
   $ansprechpartner_text .= "<br>Tel: +43/1/815 08 50 DW ".$staff_tel."\n";
   if ($staff_fax) { $ansprechpartner_text .= "<br>Fax: +43/1/815 08 50 DW ".$staff_fax."\n";}
   $ansprechpartner_text .= "<br>E-mail: <a href='mailto:".$staff_email."'>".$staff_email."</a></p>";
  }
  close (GET_STAFF) die "can't close mitarbeiter.info: $!\n";
}

$lva_ansprechparnter1 und 2 werden als Parameter (korrekt) übergeben. Deren Inhalt, und der von $staff_id sind Strings der Form "staff19", "staff13", ...

Wenn ich die Funktion aber aufrufe, und 2 Ansprechpartner an das Script übergeben wurden, dann enthält "$ansprechpartner_text" trotzdem nur den Text für $lva_ansprechpartner2. Der 1.Ansprechpartner wird einfach in den Wind geschossen :-(

Ich sehe aber keinen Fehler! Und im Script wird auch an keiner anderen Stelle etwas an den Variablen $lva_ansprechpartner1/2 und auch nicht an $ansprechpartner_text geändert! Die drei kommen nur in dieser Funktion vor - also muss der Hund irgendwo da begraben sein!

Vielleicht riecht ja einer von euch, wo's hier stinkt ;-)

liebe Grüsse
Bernhard

  1. Hi,

    Wenn ich die Funktion aber aufrufe, und 2 Ansprechpartner an das Script übergeben wurden, dann enthält "$ansprechpartner_text" trotzdem nur den Text für $lva_ansprechpartner2. Der 1.Ansprechpartner wird einfach in den Wind geschossen :-(

    welcher Text bedeutet was? Bedenke, daß wir in dem Sinn Deines Scripts nicht drinstecken.

    Ich sehe aber keinen Fehler!

    Ich sehe etwas anderes nicht: $lva_ansprechpartner2

    Liegt's vielleicht daran? ;-)

    Cheatah

    1. Hallo Cheatah!

      welcher Text bedeutet was? Bedenke, daß wir in dem Sinn Deines Scripts nicht drinstecken.

      Sorry, anmassend wie ich nunmal bin, hab ich gedacht, so oft wie ich euch jetzt schon mit meinen Problemen bombadiert habe, wisst ihr dass ich ein Kursverwaltungsscript bastle ;-)

      $ansprechpartner_text, ist einfach der Text, der am Bildschirm unter der Rubrik "Ansprechpartner" angezeigt werden soll ;-)
      Und zwar gibt es für einen Kurs einnal einen, ein anderes mal aber zwei Ansprechpartner. Daher die $lva_anprechpartner1/2 !

      Ich sehe aber keinen Fehler!
      Ich sehe etwas anderes nicht: $lva_ansprechpartner2
      Liegt's vielleicht daran? ;-)

      Nein, Kopierfehler, ich probier die ganze Zeit schon rum. Und da gehts bei mir schnell mal drunter und drüber ;-)

      liebe Grüsse
      Bernhard

      1. Hi,

        welcher Text bedeutet was? Bedenke, daß wir in dem Sinn Deines Scripts nicht drinstecken.

        Sorry, anmassend wie ich nunmal bin, hab ich gedacht, so oft wie ich euch jetzt schon mit meinen Problemen bombadiert habe, wisst ihr dass ich ein Kursverwaltungsscript bastle ;-)

        ;-)

        Naja, das Problem ist nur, daß ich in den einzelnen Variablen keinen Zusammenhang erkenne. Deine $lva_ansprechpartnerX sind aus meiner Sicht nicht gefüllt, und ich weiß auch nicht, was Du unter welchen Bedingungen wo als Rückgabe erwartest.

        Cheatah

        1. Hi!

          Naja, das Problem ist nur, daß ich in den einzelnen Variablen
          keinen Zusammenhang erkenne. Deine $lva_ansprechpartnerX sind aus
          meiner Sicht nicht gefüllt, und ich weiß auch nicht, was Du unter
          welchen Bedingungen wo als Rückgabe erwartest.

          Der Mitarbeiter wird mit einem Formular konfrontiert, in das er die
          Daten des Kurses, den er ins Netz stellen will reinschreiben soll.
          Unter anderem sind da zwei select-boxes, wo er anklicken muss, wer
          als Ansprechpartner herhalten muss ;-)

          Dieses Formular, wenn abgeschickt ruft mein script auf, welches das  
          ganze KrimsKrams in eine Datei speichert. Die wird dann bei einem
          Aufruf vom Browser des Kunden angezapft und mit einem zweiten script
          dem Bildschirm des Kunden dargeboten ;-)

          $lva_ansprechpartnerX werden als Parameter vom Formular ans in-die-
          datei-schreibende Perl-Script übergeben. Habe ich kontrolliert, das
          klappt! Sie kommen richtig rüber, nur wird die if-Bedingung
          anscheinend nur einmal erfüllt!

          Die Daten der Mitarbeiter habe ich in einer eigenen Datei abgelegt:
          mitarbeiter.info Dort steht ungefähr folgendes:

          staff11::Name::Aufgabenbereich::telefonnr::faxnr::email::...

          und die Daten aus der Datei werden dann zwischenzeitlich in
          $ansprechpartner_text abgelegt, und dann im Hauptprogramm einfach in
          die Kursdatei geschrieben:

          print KURS "Preis:$preis_text\n";
          print KURS "Ansprechpartner:$ansprechpartner_text\n";
          ...

          die _text Variablen bereiten einfach den Text vor, der dann in die
          Datei kommt.

          "lva" steht übrigens für Lehrveranstaltung.

          So, ich hoffe ich habs halbwegs nachvollziehbar erklärt ;-)

          liebe Grüsse,
          Bernhard

          PS: Das ganze Script steht auf http://www.wt-akademie.at/schreibeDetail.pl.txt

  2. Hallo Bernhard,

    sub getStaff {
      open [...]
      while () {
        if (){
          if () {  }
        }
      close [...]
    }

    Irgendwie scheinen Deine Klammern mit Dir durchzugehen ;-) Entweder hast Du die schließende Klammer der Subroutine nicht kopiert. Dann schließt Du Deine Datei beim ersten Durchlauf der Schleife. Oder es fehlt die Klammer der while-Schleife. Dann wundert es mich allerdings, daß überhaupt irgendwas geht.
    Wenn man davon ausgeht, daß die Reihenfolge der Klammern stimmt (nur die schließende fürs Sub fehlt), dann wird die Schleife nur einmal durchlaufen, weil "Read from closed Filehandle" imho keinen Wert zurückliefern sollte ;-) Wenn Du nun zufällig die $staff_id von $lva_a...2 als erstes in der Datei steht, dann wir eben nur diese mit $ansprechpartener_text verknüpft.

    Hoffentlich stinkt es nicht mehr so, wenn Du das nochmal überprüft hast.

    Gruß AlexBausW

    Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

    1. Hallo Bernhard,

      sub getStaff {
        open [...]
        while () {
          if (){
            if () {  }
          }
        close [...]
      }

      Irgendwie scheinen Deine Klammern mit Dir durchzugehen ;-) Entweder hast Du die schließende Klammer der Subroutine nicht kopiert. Dann schließt Du Deine Datei beim ersten Durchlauf der Schleife. Oder es fehlt die Klammer der while-Schleife. Dann wundert es mich allerdings, daß überhaupt irgendwas geht.
      Wenn man davon ausgeht, daß die Reihenfolge der Klammern stimmt (nur die schließende fürs Sub fehlt), dann wird die Schleife nur einmal durchlaufen, weil "Read from closed Filehandle" imho keinen Wert zurückliefern sollte ;-) Wenn Du nun zufällig die $staff_id von $lva_a...2 als erstes in der Datei steht, dann wir eben nur diese mit $ansprechpartener_text verknüpft.

      Hoffentlich stinkt es nicht mehr so, wenn Du das nochmal überprüft hast.

      Gruß AlexBausW

      Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

      1. Hallo Bernhard,

        sub getStaff {
          open [...]
          while () {
            if (){
              if () {  }
            }
          close [...]
        }

        Irgendwie scheinen Deine Klammern mit Dir durchzugehen ;-) Entweder hast Du die schließende Klammer der Subroutine nicht kopiert. Dann schließt Du Deine Datei beim ersten Durchlauf der Schleife. Oder es fehlt die Klammer der while-Schleife. Dann wundert es mich allerdings, daß überhaupt irgendwas geht.
        Wenn man davon ausgeht, daß die Reihenfolge der Klammern stimmt (nur die schließende fürs Sub fehlt), dann wird die Schleife nur einmal durchlaufen, weil "Read from closed Filehandle" imho keinen Wert zurückliefern sollte ;-) Wenn Du nun zufällig die $staff_id von $lva_a...2 als erstes in der Datei steht, dann wir eben nur diese mit $ansprechpartener_text verknüpft.

        Hoffentlich stinkt es nicht mehr so, wenn Du das nochmal überprüft hast.

        Gruß AlexBausW

        Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

        1. Hallo Bernhard,

          sub getStaff {
            open [...]
            while () {
              if (){
                if () {  }
              }
            close [...]
          }

          Irgendwie scheinen Deine Klammern mit Dir durchzugehen ;-) Entweder hast Du die schließende Klammer der Subroutine nicht kopiert. Dann schließt Du Deine Datei beim ersten Durchlauf der Schleife. Oder es fehlt die Klammer der while-Schleife. Dann wundert es mich allerdings, daß überhaupt irgendwas geht.
          Wenn man davon ausgeht, daß die Reihenfolge der Klammern stimmt (nur die schließende fürs Sub fehlt), dann wird die Schleife nur einmal durchlaufen, weil "Read from closed Filehandle" imho keinen Wert zurückliefern sollte ;-) Wenn Du nun zufällig die $staff_id von $lva_a...2 als erstes in der Datei steht, dann wir eben nur diese mit $ansprechpartener_text verknüpft.

          Hoffentlich stinkt es nicht mehr so, wenn Du das nochmal überprüft hast.

          Gruß AlexBausW

          Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

  3. Hi!

    Also das habe ich jetzt schon öfters beobachtet, und es gibt mir ein wenig zu denken: Jedesmal wenn ich ein Script zum Anschauen online stelle, dann scheint es euch die Sprache zu verschlagen ! Bin ich denn echt so schlecht :-(

    Aber zu meinem Problem, das hat sich heute morgen in Luft aufgelöst: Als ich den PC aufgedreht habe, lief alles wie am Schnürchen, ohne dass ich etwas geändert hätte!

    Ein unerklärliches Phänomen. Vielleicht beglückt der Forumsgeist manchmal auch seine Besucher mit seiner Anwesenheit ;-)

    Naja, jetzt gehts jedenfalls :-)

    liebe Grüsse
    Bernhard

    1. Hallo Bernhard,

      Also das habe ich jetzt schon öfters beobachtet, und es gibt mir ein wenig zu denken: Jedesmal wenn ich ein Script zum Anschauen online stelle, dann scheint es euch die Sprache zu verschlagen !

      Ich hab` schon mal reingeschaut, aber konnte nicht gleich was entdecken. Und nebenbei betreibe ich, wie vielleicht auch andere, noch eine Hauptbeschäftigung sowie weitere Nebenbeschäftigungen (Hier verkehren also nicht nur Studenten, Hausfrauen, Arbeitslose und Rentner ;-)

      Bin ich denn echt so schlecht :-(

      Nicht wirklich ;-) Aber imho gibt es schon noch ein paar Anmerkungen *g* (Imho ist meine Programmierstil auch nicht sonderlich gut, aber man lernt ja nie aus. Ich kenne auch nur einen, der von sich behauptet, seine Programmierkünste wären nicht nur scheinbar grandios ;-).
      Ich will jetzt nicht den Perl-Lehrer spielen, das können andere besser, aber ich möchte einige Sachen anmerken, die _ich_ mir im Laufe der Zeit angewöhnt habe (und vielleicht auch einige andere):
      Als erstes deklariere alle Variablen mit my(), local() oder use vars(). Dabei hilft "use strict;" Andernfalls machst Du alle Variablen der Subroutinen global, was Dir früher oder später Scherereien verursachen kann (außerdem gibts afaik Ärger mit mod_perl ;-).
      Imho ist es auch ungünstig, innerhalb einer Subroutine einen Wert in eine globale Variable schreiben zu lassen. "$wert = &getWert();" ist imho aussagekräftiger für jemanden, der Deinen Code lesen muss ;-) Außerdem funktionieren so ähnlich auch Perls interne Funktionen: entweder sie geben einen Wert zurück den Du haben möchtest (shift(),join()), oder sie verändern den übergebenen Wert (chomp()) [ganz grob gesagt ;-)]
      Optimierungspotential liegt, wie wir in einem Posting von ?weisnichtmehr? gelesen haben, in jedem Code. Ich persönlich verwende "" nur dann, wenn der String nach Variablen geparst werden soll, oder Steuerzeichen enthält. Ansonsten ziehe ich '' vor, was afaigh (asfarasigelesesenhab ;-) Dein Skript beschleunigen kann (ich weis nicht, ob Stringparsen viel langsamer ist als viele Stringverknüpfungen, aber das kann sicher einer der Eggsbädde beantworten;-)

      Zu Deinem alten Problem mit $laenge = @_; :
      Das brauchst Du eigentlich gar nicht, da Du ja alle Elemente von @_ verändern willst. Schreibe doch einfach "foreach (@_){}". Das spart Dir zwei Variablen (ist ja noch nicht so viel), und vor jede Zeile $_[$i] zu schreiben (das ist ein wenig mehr *g*), da sich nun die Elemente von @_ in $_ durchgereicht werden.
      Einen "Verbesserungsvorschlag" hätte ich auch noch :-) Statt für jedes Tag "$_[$i] =~ s/[br]/<br>\n/g;" zu schreiben, kannst Du auch folgende RegEx verwenden, die imho leichter zu erweitern ist:
         my @tags = ('br','p','b','u','i');
         my $regex = join('',@tags);
         foreach (@_) {
            s![\s*(/)\s*($regex)\s*]!<$1$2>!oig;
            .    ^......^..........^........sicherheitshalber, man kann ja nie wissen ;-)
            .    kann man aber auch weglassen und so eine saubere Eingabe erzwingen
         }
      Wie Du siehst, brauchst Du nur dem Array die zu erkennenden Tags einverleiben und feddisch :-)
      Ob das performanter ist, kann ich nicht beantworten. Perl kompiliert normalerweise RegEx beim Skriptaufruf. Enthält die RegEx jedoch Variablen, wird der Ausdruck erst zur Laufzeit kompiliert (die Variable könnte sich ja ändern). Das kann die Performance beeinträchtigen (z.B.: bei häufigem Aufruf oder bei "großen" RegEx wie zur Erkennung von rfc-konformen URLs ;-), ist aber hier vermutlich nicht relevant. Damit die RegEx nur einmal zu Laufzeit kompiliert wird, kann man den Modifier 'o' verwenden (compile once).
      Vielleicht fällt jemand Anderem noch etwas zum Thema ein. Ansonsten, wie sollte es bei Perl auch anders sein, gibt es zu allem eine Doku: perldoc perlstyle ;-) (Aber jeder findet irgendwie seinen Stil)

      Aber zu meinem Problem, das hat sich heute morgen in Luft aufgelöst:

      [...]

      Naja, jetzt gehts jedenfalls :-)

      Dann wieder viel Spaß mit Perl :-)

      Gruß AlexBausW

      Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

      1. Hallo Alex,

        Erst mal danke für deine lange Antwort!

        Ich hab` schon mal reingeschaut, aber konnte nicht gleich was
        entdecken. Und nebenbei betreibe ich, wie vielleicht auch andere,
        noch eine Hauptbeschäftigung sowie weitere Nebenbeschäftigungen
        (Hier verkehren also nicht nur Studenten, Hausfrauen, Arbeitslose
        und Rentner ;-)

        Sollte ja um Himmels willen kein Vorfurf gewesen sein! Ich dachte ja
        es läge an mir ;-)

        Aber imho gibt es schon noch ein paar Anmerkungen *g* (Imho ist
        meine Programmierstil auch nicht sonderlich gut, aber man lernt
        ja nie aus.

        Genau das will ich ja auch damit bezwecken! Wenn ihr schon mal dabei
        seid, einen Fehler in meinem Script zu suchen, dann habt ihr
        sicherlich vorher schon 100 Sachen gefunden, die euch am Nerv gehen,
        weil zu umständlich programmiert. Und ich freu mich, wenn ihr mir
        sagt, was ich besser machen müsste. Denn ich arbeite alleine, und
        hab somit kein Team, wo ich mir von den Besseren was abschauen
        könnte ;-( Das Forum hier und ein paar Bücher sind also meine
        einzigen Quellen! Und sooooo lange bin ich ja auch noch nicht in
        diesem business -Vor zwei Jahren wusste ich noch nicht mal, wie ich
        eine email verschicken kann ;-)

        Ich will jetzt nicht den Perl-Lehrer spielen, das können andere
        besser, aber ich möchte einige Sachen anmerken, die _ich_ mir im
        Laufe der Zeit angewöhnt habe (und vielleicht auch einige andere):
        Als erstes deklariere alle Variablen mit my(), local() oder use
        vars(). Dabei hilft "use strict;" Andernfalls machst Du alle
        Variablen der Subroutinen global, was Dir früher oder später
        Scherereien verursachen kann (außerdem gibts afaik Ärger mit
        mod_perl ;-).

        Scherereien hats bereits genug gegeben :-( Ich habe vorher alles in
        eine‚m script gehabt (Termine anzeigen, Detailprogramm anzeigen,
        Kursübersicht anzeigen, Anmeldeformular anzeigen, und
        Anmeldeformular verarbeiten) Wie du dir vorstellen kannst, das reine
        Chaos :-(

        Imho ist es auch ungünstig, innerhalb einer Subroutine einen Wert
        in eine globale Variable schreiben zu lassen. "$wert = &getWert
        ();" ist imho aussagekräftiger für jemanden, der Deinen Code
        lesen muss ;-)

        Ich komme ja eigentlich mit ein bissi c/c++ background in die Web-
        Programmierung. Da muss man sowieso jede Variable vorher
        deklarieren. Aber dadurch dass es bei den Scriptsprachen so einfach
        geht, auch dank dem Konzept der globalen Variablen, zwingt einen
        keiner dazu objektorientiert (var Wert; getWert(); setWert();..) zu
        arbeiten, bzw. sich zu überlegen, welche Variablen man braucht.
        Daher auch mein zwiespältiges Verhältnis zu Javascript, Perl, und
        Co. Man kann verdammt viel damit machen, aber wenn man sich nicht
        auskennt, kostet es einem viele graue Haare ;-(

        Optimierungspotential liegt, wie wir in einem Posting von ?
        weisnichtmehr? gelesen haben, in jedem Code. Ich persönlich
        verwende "" nur dann, wenn der String nach Variablen geparst
        werden soll, oder Steuerzeichen enthält. Ansonsten ziehe ich ''
        vor,

        Du meinst bei print '' statt "" ?

        my @tags = ('br','p','b','u','i');
           my $regex = join('',@tags);
           foreach (@_) {
              s![\s*(/)\s*($regex)\s*]!<$1$2>!oig;

        Bevor ich diese Hieroglyphen in mein Script einbaue muss mir jemand sagen was das heissen soll. Vor allem: Wieso sind da Rufzeichen ! statt den Slashes / ??????

        [ ....... ist klar was das macht!
        s* ....... alle \r\t\n\b rausschmeissen
        (/) .‚... falls </EndTag> (sollte es dann nicht / heissen? ein
                   slash muss doch maskiert werden oder)
        ] ....... ist auch klar!
        <$1$2> ... was ist in dem Fall $1 (\s* oder /) und was ist $2
                   ($regex oder eins der \s*)?
        !????? ... und was sind diese Rufzeichen ????

        Conclusio: Ich nehme mal an, diese RegExpr. wandelt alle [tags] in
        <tags> um! Wäre die umgekehrte Version dann:

        s!<\s*(/)\s*($regex)\s*>![$1$2]!oig;

        ????

        Vielleicht fällt jemand Anderem noch etwas zum Thema ein.
        Ansonsten, wie sollte es bei Perl auch anders sein, gibt es zu
        allem eine Doku: perldoc perlstyle ;-) (Aber jeder findet
        irgendwie seinen Stil)

        Ich werde meinen wohl nie finden :-(

        Dann wieder viel Spaß mit Perl :-)

        Scherzkeks ;-)

        liebe grüsse,
        bernhard

        1. Hallo Bernhard,

          [...]

          Sollte ja um Himmels willen kein Vorfurf gewesen sein! Ich dachte ja
          es läge an mir ;-)

          So hab` ich das auch nicht aufgefasst :-) Der Scherz ist wohl missglückt ;-)

          [...]

          Aber dadurch dass es bei den Scriptsprachen so einfach
          geht, auch dank dem Konzept der globalen Variablen, zwingt einen
          keiner dazu objektorientiert (var Wert; getWert(); setWert();..) zu
          arbeiten, bzw. sich zu überlegen, welche Variablen man braucht.

          Genau deshalb sollte man immer "use strict;" verwenden. In meine Anfängen mit Perl hab` ich das auch ignoriert, und musst immer wieder falsch geschriebene Variablen korrigieren, bzw. ziemlich viele Variablennamen ausdenken ;-)
          Objektorientiert muss man imho nicht unbedingt programmieren. Aber Variablen- und Routinenbezeichnungen sowie Zuweisungen sollten einigermaßen selbsterklärend sein. Wenn irgendwo eine Subroutine aufgerufen wird, der "keine" Variable übergeben wird, und die "keinen" Wert zurückliefert, macht einen das schon stutzig ;-)

          Daher auch mein zwiespältiges Verhältnis zu Javascript, Perl, und
          Co. Man kann verdammt viel damit machen, aber wenn man sich nicht
          auskennt, kostet es einem viele graue Haare ;-(

          Und es kostet Nächte die man ruhig durchschlafen kann (ging mir bei meinem ersten größeren Projekt http://ahnenforschung.net so :-)

          Du meinst bei print '' statt "" ?

          Genau, aber auch bei Zuweisungen und Stringverknüpfungen verwende ich "" nur, wenn sich im String Steuerzeichen oder eine Variable befinden.

          s![\s*(/)\s*($regex)\s*]!<$1$2>!oig;
          Bevor ich diese Hieroglyphen in mein Script einbaue muss mir jemand sagen was das heissen soll. Vor allem: Wieso sind da Rufzeichen ! statt den Slashes / ??????

          Hier empfiehlt sich wieder mal perldoc perlre ;-) Perl bietet Dir fast alle Freiheiten, so auch die, Deine Begrenzer für den Regulären Ausdruck in gewissem Rahmen zu wählen. So ist s### genauso zulässig wie s!!!. Mann kann sogar Klammerpaare verwenden: s()() aber auch mischen s<>// [Falls vorne Klammern, dann muss der hinter Begrenzer auch paarig sein].
          Das ist besonders sinnvoll, wenn Dein Suchausdruck viele Slashs enthält, wie zB. eine URL. So musst Du nicht jeden Slash quoten, bzw. eine Variable durch quotemeta() jagen (http://blablablub/sadf...arrgh ;-). Allerdings musst Du dann imho die im Ausdruck zu findenen Begrenzer quoten (zB.: !). Bei einfachem Patternmatching mit m## ist dann aber das 'm' zwingend, bei m// darf es fehlen.

          [ ....... ist klar was das macht!
          s* ....... alle \r\t\n\b rausschmeissen
            
          einfach alle Whitespaces, also auch Leerzeichen. Das kann man auch wieder rausnehmen. Es ist so aber ein wenig toleranter gegen Fehleingaben ;-) ([ / b  ])

          (/) ..... falls </EndTag> (sollte es dann nicht / heissen? ein
                     slash muss doch maskiert werden oder)

          Siehe oben: Maskiert werden muss der Slash nur, wenn er als Begrenzer/Klammernpaar dient.

          ] ....... ist auch klar!
          <$1$2> ... was ist in dem Fall $1 (\s* oder /) und was ist $2
                     ($regex oder eins der \s*)?

          $1 und $2 enthalten das Suchergebnis der entsprechenden Klammern. (?:$regex) gruppiert zwar ebenfalls, verhindert aber, daß der Treffer der Klammer in $1..$9 gespeichert wird.

          Und hier kommt gleich noch eine Änderung der RegEx :-): (die Erfassung von Whitespaces hab ich mal weggelassen. Schließlich muss man die User ein wenig zu richtigen Eingaben disziplinieren ;-)
             s![((?:/)(?:$regex))]!<$1>!oig;
                 ^................^....die äußeren Klammern werden mit $1 "refernenziert", da in den beiden innern mit (?: ein Backtracking unterbunden wird.
          [...]

          Ich hoffe das bringt Dich wieder auf den rechten Pfad eines Perljüngers ;-)

          Gruß AlexBausW

          Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

          1. Hallo Bernhard,

            So hab` ich das auch nicht aufgefasst :-) Der Scherz ist wohl
            missglückt ;-)

            ;-)

            Genau deshalb sollte man immer "use strict;" verwenden. In meine
            Anfängen mit Perl hab` ich das auch ignoriert, und musst immer
            wieder falsch geschriebene Variablen korrigieren, bzw. ziemlich
            viele Variablennamen ausdenken ;-)

            *g* das kenn ich ;-)

            Und hier kommt gleich noch eine Änderung der RegEx :-)

            Das macht echt Spass gell? Naja, vielleicht kapier ich das Zeugs
            auch irgendwann mal, und dann darf ich mit den greenhorns im Forum
            auch solche Spässe treiben ;-)

            s![((?:/)(?:$regex))]!<$1>!oig;
                   ^................^....die äußeren Klammern werden mit
            $1 "refernenziert", da in den beiden innern mit (?: ein
            Backtracking unterbunden wird.

            Ich hatte mal eine Informatikprüfung auf der Uni, zum Thema
            Rekusrionen und Backtracking. Ich bin zweimal durchgeflogen :-(

            Ich hoffe das bringt Dich wieder auf den rechten Pfad eines
            Perljüngers ;-)

            Amen,
            Bernhard

      2. Moin!

        Imho ist es auch ungünstig, innerhalb einer Subroutine einen Wert in eine globale Variable schreiben zu lassen. "$wert = &getWert();" ist imho aussagekräftiger für jemanden, der Deinen Code lesen muss ;-)

        Sehr richtig, und verdammt wichtig. Nichts ist so wartungsunfreundlich wie globale Variablen, die von allen moeglichen Funktionen wild veraendert werden. Finde mal alle diese Stellen in einem 1000-Zeilen-Programm (was ja noch sehr klein ist). Das ist wirklich eine der wichtigsten Regeln beim Programmieren, deswegen will ich das an dieser Stelle einfach nochmal betonen. :-)

        Optimierungspotential liegt, wie wir in einem Posting von ?weisnichtmehr? gelesen haben, in jedem Code. Ich persönlich verwende "" nur dann, wenn der String nach Variablen geparst werden soll, oder Steuerzeichen enthält. Ansonsten ziehe ich '' vor, was afaigh (asfarasigelesesenhab ;-) Dein Skript beschleunigen kann (ich weis nicht, ob Stringparsen viel langsamer ist als viele Stringverknüpfungen, aber das kann sicher einer der Eggsbädde beantworten;-)

        Weiss ich auch nicht, aber ob man bei Strings, die nicht interpoliert werden sollen (also Variablen enthalten), " oder ' schreibt, ist imho ziemlich egal. Gut, zur Kompilierzeit muss Perl mal eben checken, ob Variablen enthalten sind, wenn man die interpolierenden Quotes (also ") verwendet, aber zur Laufzeit ist das dann schon in interne Strukturen umgesetzt und sollte keinen Unterschied mehr machen.

        Deinen dynamischen RegExp schau ich mir jetzt mal nicht an, da bin ich noch zu besoffen dazu. ;-) Aber an Bernhard wegen der ! statt / lies mal <../../sfarchiv/2000_3/t21729.htm#a111615>, und natuerlich perldoc perlop Abschnitt "Quote and Quote-like Operators".

        So long

        1. Hallo Calocybe!

          Sehr richtig, und verdammt wichtig. Nichts ist so
          wartungsunfreundlich wie globale Variablen, die von allen
          moeglichen Funktionen wild veraendert werden. Finde mal alle
          diese Stellen in einem 1000-Zeilen-Programm (was ja noch sehr
          klein ist). Das ist wirklich eine der wichtigsten Regeln beim
          Programmieren, deswegen will ich das an dieser Stelle einfach
          nochmal betonen. :-)

          Genau dieses Problem hat euch schon einige Verzweiflungs-postings
          meinerseits eingebracht ;-)

          Deinen dynamischen RegExp schau ich mir jetzt mal nicht an, da
          bin ich noch zu besoffen dazu. ;-)

          Na sag mal! Wo treibst du dich denn rum, dass du um halb zwei
          nachmittags noch/schon besoffen bist ;-)

          Aber an Bernhard wegen der ! statt / lies mal
          <../../sfarchiv/2000_3/t21729.htm#a111615>, und
          natuerlich perldoc perlop Abschnitt "Quote and Quote-like
          Operators".

          Danke!

          Liebe Grüsse
          Bernhard