Mailinglist Archive: opensuse-de (1512 mails)
| < Previous | Next > |
Re: dynamische Zuweisung von Variablen mit PERL
- From: Torsten Foertsch <torsten.foertsch@xxxxxxx>
- Date: Wed, 4 Jul 2007 17:57:19 +0200
- Message-id: <200707041757.25679.torsten.foertsch@gmx.net>
On Wednesday 04 July 2007 16:42, Hannes Vogelmann wrote:
Wenn Du weißt, was Du tust, geht das. Es führt aber zu schlecht wartbaren
Programmen.
So, nachdem das gesagt ist, ...
$ perl -e '$a="otto"; ${"a"}="klaus"; print "$a\n"'
klaus
Du arbeitest hier mit symbolischen Referenzen. D.h. mit "use strict 'refs'"
funktioniert das nicht.
ABER:
$ perl -e 'my $a="otto"; ${"a"}="klaus"; print "$a\n"'
otto
Hier verdeckt die mit "my" deklarierte Variable die globale Variable $a. Du
kannst sie nur noch voll referenzieren als $main::a:
$ perl -e 'my $a="otto"; ${"a"}="klaus"; print "$a, $main::a\n"'
otto, klaus
Soll trotzdem die my-Variable angesprochen werden, brauchst Du eval:
$ perl -e 'my $a="otto"; ${"a"}="klaus"; eval q{$a="heinz"}; print "$a,
$main::a\n"'
heinz, klaus
Willst Du also mit globalen oder mit "local" lokalisierten Variable arbeiten,
dann so:
$ perl -e '${"a$_"}="x$_" for (1..3); print "$a1 $a2 $a3\n"'
x1 x2 x3
Mit my-Variablen geht es nur so:
$ perl -e 'my ($a1,$a2,$a3); eval qq{\$a$_="x$_"} for (1..3); print "$a1 $a2
$a3\n"'
x1 x2 x3
Das birgt aber die Gefahr, daß in "x$_" irgendwas steht, was Du quoten müßtest.
Besser ist es da mit richtigen Referenzen zu arbeiten:
$ perl -e 'my ($a1,$a2,$a3); ${eval q{\$a}.$_}="x$_" for (1..3); print "$a1 $a2
$a3\n"'
x1 x2 x3
Hier bestimmst Du mit dem String-eval nur die Adresse Deiner Variablen, die
Du gleich wieder durch das umschließende ${} für die Zuweisung benutzt.
Torsten
Für den speziellen Zweck, wo ich es jetzt hier brauche benötige ich
kein Array. Ich will nur Variablen-Namen dynamisch aus sich
verändernden Variablen aufrufen bzw. generieren können.
Wenn Du weißt, was Du tust, geht das. Es führt aber zu schlecht wartbaren
Programmen.
So, nachdem das gesagt ist, ...
$ perl -e '$a="otto"; ${"a"}="klaus"; print "$a\n"'
klaus
Du arbeitest hier mit symbolischen Referenzen. D.h. mit "use strict 'refs'"
funktioniert das nicht.
ABER:
$ perl -e 'my $a="otto"; ${"a"}="klaus"; print "$a\n"'
otto
Hier verdeckt die mit "my" deklarierte Variable die globale Variable $a. Du
kannst sie nur noch voll referenzieren als $main::a:
$ perl -e 'my $a="otto"; ${"a"}="klaus"; print "$a, $main::a\n"'
otto, klaus
Soll trotzdem die my-Variable angesprochen werden, brauchst Du eval:
$ perl -e 'my $a="otto"; ${"a"}="klaus"; eval q{$a="heinz"}; print "$a,
$main::a\n"'
heinz, klaus
Willst Du also mit globalen oder mit "local" lokalisierten Variable arbeiten,
dann so:
$ perl -e '${"a$_"}="x$_" for (1..3); print "$a1 $a2 $a3\n"'
x1 x2 x3
Mit my-Variablen geht es nur so:
$ perl -e 'my ($a1,$a2,$a3); eval qq{\$a$_="x$_"} for (1..3); print "$a1 $a2
$a3\n"'
x1 x2 x3
Das birgt aber die Gefahr, daß in "x$_" irgendwas steht, was Du quoten müßtest.
Besser ist es da mit richtigen Referenzen zu arbeiten:
$ perl -e 'my ($a1,$a2,$a3); ${eval q{\$a}.$_}="x$_" for (1..3); print "$a1 $a2
$a3\n"'
x1 x2 x3
Hier bestimmst Du mit dem String-eval nur die Adresse Deiner Variablen, die
Du gleich wieder durch das umschließende ${} für die Zuweisung benutzt.
Torsten
| < Previous | Next > |