jenk heidsen: suche/ersetzen per regulären befehl und wildcards ?

hallo leute,

ich hab ein ziemlich langes konstrukt in der art:

$template =~ s/<!--b-->/$b/g;
$template =~ s/<!--c-->/$c/g;
$template =~ s/<!--d-->/$d/g;
$template =~ s/<!--e-->/$e/g;
(...)

um variablen in den entsprechenden templates zu ersetzen.

mein frage ist nun, kann ich diese prozedur abkürzen,
statt jede variable/jeden platzhalter in einer extrazeile
auszutauschen ?

vielen dank für jede hilfe,

jenk.

  1. Halihallo jenk

    mein frage ist nun, kann ich diese prozedur abkürzen,
    statt jede variable/jeden platzhalter in einer extrazeile
    auszutauschen ?

    Ja. Iteriere über einen Hash und generiere das RegExp-Muster automatisch.

    Viele Grüsse

    Philipp

    1. Iteriere über einen Hash und generiere das RegExp-Muster automatisch.

      sorry, ich versteh da nur bahnhof :(

  2. Hi,

    so etwas sollte gehen:
    $template =~ s/<!--(\w)-->/${$1}/g;

    Gruss,
    Frédéric

    1. $template =~ s/<!--(\w)-->/${$1}/g;

      nein, geht leider nicht :( die platzhalter werden
      nicht ersetzt...

      1. Halihallo jenk

        $template =~ s/<!--(\w)-->/${$1}/g;
        nein, geht leider nicht :( die platzhalter werden
        nicht ersetzt...

        <code ver="1">
        $a = '15';
        $b = '27';
        $template = "'<!--a-->
        test <!--b-->'";
        print 'Anzahl: ' . ($template =~ s/<!--(\w)-->/${$1}/sg) . "\n";
        print $template;
        </code>

        <code ver="2">
        my $a = '15';
        my $b = '27';
        $template = "'<!--a-->
        test <!--b-->'";
        print 'Anzahl: ' . ($template =~ s/<!--(\w)-->/${$1}/sg) . "\n";
        print $template;
        </code>

        Code 1 funktioniert bei mir, Code 2 nicht. Unterschied: Variablen $a, $b sind einmal
        nur im aktuellen Scope definiert, das andere Mal global. Die Variablen müssen folglich
        global definiert sein? - Halte ich für komisch, macht jedoch den Anschein...

        Viele Grüsse

        Philipp

        1. use Mosche;

          my $a = '15';
          my $b = '27';
          $template = "'<!--a-->
          test <!--b-->'";
          print 'Anzahl: ' . ($template =~ s/<!--(\w)-->/${$1}/sg) . "\n";
          print $template;

          Code 1 funktioniert bei mir, Code 2 nicht. Unterschied: Variablen $a, $b sind einmal
          nur im aktuellen Scope definiert, das andere Mal global. Die Variablen müssen folglich
          global definiert sein? - Halte ich für komisch, macht jedoch den Anschein...

          Scheint daran zu liegen, wie Perl mit dem ${} Konstrukt umgeht - es scheint nur auf Package-Variablen von main:: zugreifen zu können (was private Variablen nicht sind).

          Besser ist allerdings die von dir bereits genannte Möglichkeit mit dem Hash.

          my %s;

          $s{a} = '15';
          $s{b} = '27';

          foreach (keys %hash) {
              $template =~ s/$_/$s{$_}/gs;
          }

          use Tschoe qw(Matti);

          --

            Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
          1. Halihallo Matti

            Scheint daran zu liegen, wie Perl mit dem ${} Konstrukt umgeht - es scheint nur auf Package-Variablen von main:: zugreifen zu können (was private Variablen nicht sind).

            Denke ich auch und es ist auch verständlich, da dies für die Perl-Porters einfacher
            umzusetzen war... Auf die Symbol-Table lässt sich wesentlich einfacher zugreifen, als
            auf BLOCK-Scope definierte Variablen. Waren die Porters wiedermal zu faul :-)

            ... wenn ich mich nicht irre, Angaben wie immer ohne Gewähr...

            Besser ist allerdings die von dir bereits genannte Möglichkeit mit dem Hash.
            foreach (keys %hash) {

            ^^^^^  s/%hash/%s/g :-)

            Viele Grüsse

            Philipp