Frédéric: RA: ${"mob_$1"}

Hallo, ich habe eine kleine Frage zu diesen RA (regülärer Ausdruck).

$line =~ s/<moboard\s+(\w+)>/${"mob_$1"}/g;

Kleiner Beispiel:

$mob_title="EIN TITEL";
$line= "<moboard title>";

liefert: $line=$mob_titel  (="EIN TITEL")

Den ersten Teil habe ich verstanden (<moboard\s+(\w+)>), aber beim zweiten Teil verstehe ich nicht alles.

Was bedeutet das "$" vorne? Ist es eifach das zeichen für eine Variabel? Und was machen die geschweiften Klammern?

  1. hi!

    $line =~ s/<moboard\s+(\w+)>/${"mob_$1"}/g;
    Was bedeutet das "$" vorne? Ist es eifach das zeichen für eine
    Variabel? Und was machen die geschweiften Klammern?

    Das ist Teufelszeug, das Perl zur Verfügung stellt, um merkwürdige
    Dinge zu machen, die man lieber anders lösen sollte. Ein Beispiel:

    === cut ===
    #!/usr/bin/perl

    $name = "hallo";
    ${$name} = "welt";
    print $hallo;
    === cut ===

    Durch das ${} wird eine Variable erzeugt bzw. auf eine Variable
    zugegriffen. In diesem Fall wird dazwischen die Variable $name aus-
    gewertet. Dadurch entsteht ${"hallo"} und das wird dann ausgewertet
    zu $hallo.

    In dem regulären Ausdruck oben ist es das gleiche: dort wird der
    String allerdings erst noch zusammengesetzt, und zwar aus "mob_"
    und dem, was in $1 steht (in $1 steht das, was im regulären Ausdruck
    anstelle der Klammern gefunden wurde).

    Wenn man dieses Problem vernünftig lösen möchte, verwendet man
    allerdings lieber einen Hash, der die in $1 stehenden Strings als
    Schlüssel enthält. Das würde dann ungefähr so aussehen:

    $line =~ s/<moboard\s+(\w+)>/$hashname{$1}/g;

    Vorher muss natürlich $hashname als Hash angelegt werden und alle
    Schlüssel enthalten. Diese zweite Lösung hat allerdings noch den
    Vorteil, dass die Variablen, die in $1 stehen, nicht unbedingt
    existieren müssen. Im obigen Fall würde ein "use strict;" wohl zu
    einem Fehler führen, wenn die Variable noch nicht existiert, auf
    die zugegriffen werden soll.

    bye, Frank!