RA: ${"mob_$1"}
Frédéric
- perl
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?
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!