Lars: innerhalb von $_ Text ersetzen

hi,

ich moechte eine HTML-Seite auslesen und dann innerhalb eines HTML-Tags etwas aendern.
das auslesen ist kein thema, das anschliessende anzeigen auch nicht, aber moechte eine auslesen/ersetzen routine basteln, die allgemein gueltig ist.

folgender tag:
<input type="text" name="sperre" size="10" maxlength="1" value="$sperre">

so, ich moechte nun innerhalb des o.g. tags das value $sperre ersetzen durch einen wert, den ich aus einer anderen datei lese, und dann halt entsprechend einsetzen moechte.

wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.

das groesste problem liegt darin, das ja die namen fuer die values unterschiedlich lang sind.

kann mir jemand nen denkanstoss geben?

vielen dank bis hierher

bye Lars

  1. Hi,

    wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.

    dann machst Du vermutlich etwas falsch. Nenn doch mal bitte Deinen funktionierenden sowie Deinen nicht funktionierenden Code.

    Cheatah

    1. Hi,

      wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.

      dann machst Du vermutlich etwas falsch. Nenn doch mal bitte Deinen funktionierenden sowie Deinen nicht funktionierenden Code.

      Cheatah

      hi,

      sub test {
      $errormsg = "Fehler beim Lesen der Datei: http://netserver/vote/index.html";
      print "Content-type: text/html\n
      <html><head>";
      open (DATEI, "/usr/local/httpd/htdocs/vote/index.html") &error($errormsg);
      while (<DATEI>) {
        $test = $_;
        print $test;
      }

      close (DATEI);
      exit;
      }

      wenn ich nun $test = "<input type="text" name="sperre" size="10" maxlength="1" value="$sperre">";

      schreibe und ihn dann "ausprinte" ersetzt er mir &sperre korrekt.

      so long

      lars

      1. Hi,

        »»  while (<DATEI>) {

        $test = $_;
          print $test;

        das gibt selbstverständlich die Datei so aus, wie sie ist, denn Du veränderst ja nichts. Suchen und Ersetzen geht z.B. mit Hilfe von regulären Ausdrücken, siehe

        perldoc perlre

        Cheatah

      2. hi ho

        meinst du sowas wie:

        »»  while (<DATEI>) {
        s/$sperre/$sperre/e;

        $test = $_;
          print $test;

        ?

        sicherer (im sinne von -> nur wirklich ersetzen, wenn es an der richtigen stelle steht...) waere natuerlich

        s/(<input[^>]+value=")$sperre("[^>]*>)/"$1$sperre$2"/ei;

        :-)

        e = evaluate
        i = case insensitive
        $sperre steht in diesem fall als Platzhalter im HTML-Text, das $ ist mit \ maskiert

        cua

        n.d.p.

        1. Hi,

          s/$sperre/$sperre/e;

          s!/e!/g! ;-)

          Cheatah

          1. hi ho

            s/$sperre/$sperre/e;
            s!/e!/g! ;-)

            huch :-)
            hast recht, das /e brauch ich ja gar nicht ...

            cua

            n.d.p.

        2. hi ho

          meinst du sowas wie:

          »»  while (<DATEI>) {
          s/$sperre/$sperre/e;

          $test = $_;
            print $test;

          ?

          sicherer (im sinne von -> nur wirklich ersetzen, wenn es an der richtigen stelle steht...) waere natuerlich

          s/(<input[^>]+value=")$sperre("[^>]*>)/"$1$sperre$2"/ei;

          hi,

          so weit so gut,
          aber das kann ich ja dann nur immer auf ein projekt mir zuerchtbasteln.
          mein gedanke war der, das das allgemein gueltig ist.
          doch irgendwie schaffe ich es nicht.
          wenn ich den wert fuer $sperre aus der html-datei auslese und ihn ersetze, funzt es ja, aber wie kann ich es machen, das ich eine zahl statt $sperre habe, und die dann nehme, um sie als datensatznummer zu verwenden $daten[meineausgelesenezahl];?
          wie bekomme ich nur den inhalt von value="meinezahl" ??
          irgendwie bin ich zu bloed dafuer glaube ich.

          thx so long

          lars

          1. hi ho

            meinst du sowas wie:

            »»  while (<DATEI>) {
            s/$sperre/$sperre/e;

            $test = $_;
              print $test;

            ?

            sicherer (im sinne von -> nur wirklich ersetzen, wenn es an der richtigen stelle steht...) waere natuerlich

            s/(<input[^>]+value=")$sperre("[^>]*>)/"$1$sperre$2"/ei;

            sub test {
            $errormsg = "Fehler beim Lesen der Datei: index.html";
            print "Content-type: text/html\n
            <html><head>
            ";
            open (DATEI "index.html") &error($errormsg);
            while (<DATEI>) {
              $test = $_;
              $test =~ s/(value=")1("[^>]*>)/"$1$daten[1]$2"/; #  und das
              $test =~ s/(value=")2("[^>]*>)/"$1$daten[2]$2"/; #  hier will
              $test =~ s/(value=")3("[^>]*>)/"$1$daten[3]$2"/; #  ich nur 1x tippen muessen
              print $test;
            }
            print "Test: ".$test1;
            close (DATEI);
            exit;
            }

            soweit meine routine.

            lars

            1. re hi

              ich hab zwar nicht ganz verstanden, was du meinst, aber ich vermute mal, du meinst das:-) :

              $test =~ s/(value=")(\d+)("[^>]*>)/"$1$daten[$2]$3"/e;
              oder halt
              $test =~ s/(value=")(\d+)("[^>]*>)/$1$daten[$2]$3/;

              das ergebnis ist bei beiden das gleiche, obwohl beide genaugenommen was anderes machen (siehe perldoc:-))

              obwohl ich mich in diesem falle nicht so auf zahlen spezialisieren wuerde, kommt allerdings auf den zusammenhang an - ich wuerde dann wohl eher mit hashes arbeiten.
              der haken ist naemlich - wenn hinter value keine zahlen stehen, wird auch nichts ersetzt.

              cua

              n.d.p.

              1. hi,

                erst mal danke fuer deine hilfe,

                nun zu meinem prob:

                ich habe ein script, welches ich per html-oberflaeche konfigurieren moechte.
                ich habe aber keine lust, das komplette html-dokument in mein script zu packen. die html-seite erstelle ich bequem mit homesite, da ich sie eventuell ja noch erweitern will.
                nun moechte ich diese seite aufrufen, und mein script soll in die felder die entsprechenden werte aus der konfigurationsdatei ausspucken.
                nun stehe ich aber halt noch vor nem weiteren problem, ich habe auch radiobuttons in diesem html-document, die muss ich ja auch noch setzen.

                wird ne komplizierte geschichte, daher dachte ich mir, ich koennte ne allgemein gueltige regel zum einsetzen finden, die ich in spaeteren projekten noch gebrauchen bzw. benutzen koennte ohne diese wieder mit viel aufwand anzupassen.

                ich hoffe ich habe dir das prob genau genug erklaert.

                cu
                lars

                1. Hallo Lars,

                  vielleicht suchst Du sowas:

                  #!/usr/bin/perl -w

                  hier werden die Informationen gesammelt

                  $Felder[2] = "blabla";
                  $Werte[2] = "hurra";
                  $Size[2] = "20";

                  $Inhalt = "print <<EOT\n";
                  open(IN,"formular.html");
                  $Inhalt .= $_ while(<IN>);
                  close(IN);
                  $Inhalt .= "\nEOT\n;\n";

                  eval($Inhalt);

                  wenn in der HTML Datei beispielsweise
                      <input type="text" name="$Felder[2]" value="$Werte[2]" size="$Size[2]">

                  steht, dann ersetzt das 'eval()' mit die Variablenbezeichnungen mit den Inhalt der realen Variablen und gibt das aus.
                  es wird dann, nach obigem Beispiel ausgegeben

                  <input type="text" name="blabla" value="hurra" size="20">

                  Grüße
                    Klaus

                  1. hi,

                    danke das du dich meines probs angenommen hast.

                    ich habe es jetzt auch ne andere art&weise gemacht.

                    mein configfile sieht so etwa aus:

                    wert1
                    wert2
                    wert3
                    wert4
                    wert5

                    lese alles in @daten

                    so, meine html tags haben im value-bereich ne nummer (durchnummeriert vom ersten bis zum letzten)
                    $i = zaehlervariable
                    ersetze nun mit ~s/$i/$daten[$i]/e; meinen zu ersetzenden text, und fuelle dadurch meine felder aus.

                    funzt einwandfrei, habe nur noch keine variante fuer radiobuttons gebastelt.

                    vielleicht nicht die eleganteste variante, aber immerhin funzt sie einwandfrei.

                    liebe gruesse

                    lars

  2. so, ich moechte nun innerhalb des o.g. tags das value $sperre ersetzen durch einen wert, den ich aus einer anderen datei lese, und dann halt entsprechend einsetzen moechte.

    wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.

    Das geht natürlich so einfach nicht. Dann könnte ja irgendwo in einer eingelesenen Datei durch Zufall
    irgendeine Zeichenkette stehen, die zufällig gleich ist mit eine Variable in deinem Programm. Das wäre
    natürlich nicht praktikabel.
    Was du machen mußt, is, einfach ein Suchen/Ersetzen auf die aktuelle Zeile anwenden.
    Allerdings weiß ich nicht, ob Perl (direkt) durch eine Variable ersetzen kann (also z.B. s/ErsetzenText/$sperre).
    Probier's einfach mal aus. Vielleicht kann ja ein anderer Forumsteilnehmer, der das genauer weiß,  noch
    etwas dazu sagen.

    Tobias

    1. so, ich moechte nun innerhalb des o.g. tags das value $sperre ersetzen durch einen wert, den ich aus einer anderen datei lese, und dann halt entsprechend einsetzen moechte.

      wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.

      Das geht natürlich so einfach nicht. Dann könnte ja irgendwo in einer eingelesenen Datei durch Zufall
      irgendeine Zeichenkette stehen, die zufällig gleich ist mit eine Variable in deinem Programm. Das wäre
      natürlich nicht praktikabel.
      Was du machen mußt, is, einfach ein Suchen/Ersetzen auf die aktuelle Zeile anwenden.
      Allerdings weiß ich nicht, ob Perl (direkt) durch eine Variable ersetzen kann (also z.B. s/ErsetzenText/$sperre).
      Probier's einfach mal aus. Vielleicht kann ja ein anderer Forumsteilnehmer, der das genauer weiß,  noch
      etwas dazu sagen.

      Tobias

      hi,

      danke fuer die idee, aber habe ich bereits probiert, geht ja nicht da viriablen unterschiedlicher laenge!

      bye lars

      1. Hi,

        danke fuer die idee, aber habe ich bereits probiert, geht ja nicht da viriablen unterschiedlicher laenge!

        Wie Variablen unterschiedlicher Länge?
        (was auch immer das heißt - es dürfte Perl nicht stören)

        Tobias

        1. Hi,

          danke fuer die idee, aber habe ich bereits probiert, geht ja nicht da viriablen unterschiedlicher laenge!

          Wie Variablen unterschiedlicher Länge?
          (was auch immer das heißt - es dürfte Perl nicht stören)

          Tobias

          hi,

          1. variable: $sperre
          2. variable: $test
          3. variable: $nochnevariable
          4. variable: $oderauchnevariablemitdieserlaenge

          cu lars

          [http://www.lars-witter.de/selfhtmlpics/work.gif]