Mailinglist Archive: opensuse-de (1512 mails)

< Previous Next >
Re: dynamische Zuweisung von Variablen mit PERL
On Wednesday 04 July 2007 16:42, Hannes Vogelmann wrote:
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 >
Follow Ups