dynamische Zuweisung von Variablen mit PERL
Moin, ich habe eine Frage zur dynamischen Zusweisung von Variablen-Namen mit Perl. Am besten mit einem einfachen Beispiel: Ich habe eine Schleife, die den Variablen a_0 bis a_9 die Werte 0 bis 9 zuweisen soll. Sinngemäß also: for ($n = 0; $ < 10; $n++) { my $a_n = n; weitere Befehle; } So geht es natürlich nicht, weil das "n" in "a_n" nicht dem $n entspricht und so nur jedesmal "a_n" neu definiert wird. Wie kann ich den index $n in der Variablendefinition so einfließen lassen dass ich sinngemäß 10 Variablen a_"$n" bekomme? Danke für Hinweise. Hannes -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mittwoch, 4. Juli 2007 schrieb Hannes Vogelmann:
Moin,
ich habe eine Frage zur dynamischen Zusweisung von Variablen-Namen mit Perl.
Am besten mit einem einfachen Beispiel:
Ich habe eine Schleife, die den Variablen a_0 bis a_9 die Werte 0 bis 9 zuweisen soll. Sinngemäß also:
for ($n = 0; $ < 10; $n++) { my $a_n = n; weitere Befehle; }
So geht es natürlich nicht, weil das "n" in "a_n" nicht dem $n entspricht und so nur jedesmal "a_n" neu definiert wird.
Wie kann ich den index $n in der Variablendefinition so einfließen lassen dass ich sinngemäß 10 Variablen a_"$n" bekomme?
my ${a_$i} = $n; Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Moin, Am Tag 07-07-04 zur Zeit 15:14:32 schrieb Dr. Jürgen Vollmer:
Am Mittwoch, 4. Juli 2007 schrieb Hannes Vogelmann:
Moin,
ich habe eine Frage zur dynamischen Zusweisung von Variablen-Namen mit Perl.
Am besten mit einem einfachen Beispiel:
Ich habe eine Schleife, die den Variablen a_0 bis a_9 die Werte 0 bis 9 zuweisen soll. Sinngemäß also:
for ($n = 0; $ < 10; $n++) { my $a_n = n; weitere Befehle; }
So geht es natürlich nicht, weil das "n" in "a_n" nicht dem $n entspricht und so nur jedesmal "a_n" neu definiert wird.
Wie kann ich den index $n in der Variablendefinition so einfließen lassen dass ich sinngemäß 10 Variablen a_"$n" bekomme?
my ${a_$i} = $n;
hmm, so geht das leider nicht. Ich bekomme dann eine Fehlermeldung: Can't declare scalar dereference in my at ./test.pl line 6, near "} =" Gruß, Hannes
Am Mittwoch, 4. Juli 2007 schrieb Hannes Vogelmann:
Moin,
Am Tag 07-07-04 zur Zeit 15:14:32 schrieb Dr. Jürgen Vollmer:
Am Mittwoch, 4. Juli 2007 schrieb Hannes Vogelmann:
Moin,
ich habe eine Frage zur dynamischen Zusweisung von Variablen-Namen mit Perl.
Am besten mit einem einfachen Beispiel:
Ich habe eine Schleife, die den Variablen a_0 bis a_9 die Werte 0 bis 9 zuweisen soll. Sinngemäß also:
for ($n = 0; $ < 10; $n++) { my $a_n = n; weitere Befehle; }
So geht es natürlich nicht, weil das "n" in "a_n" nicht dem $n entspricht und so nur jedesmal "a_n" neu definiert wird.
Wie kann ich den index $n in der Variablendefinition so einfließen lassen dass ich sinngemäß 10 Variablen a_"$n" bekomme?
my ${a_$i} = $n;
hmm, so geht das leider nicht. Ich bekomme dann eine Fehlermeldung:
Can't declare scalar dereference in my at ./test.pl line 6, near "} ="
sorry, ich meinte natürlich: ${"a_$i"} Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Hallo, Am Mit, 04 Jul 2007, Dr. Jürgen Vollmer schrieb:
Am Mittwoch, 4. Juli 2007 schrieb Hannes Vogelmann:
Am Tag 07-07-04 zur Zeit 15:14:32 schrieb Dr. Jürgen Vollmer: [..]
my ${a_$i} = $n;
hmm, so geht das leider nicht. Ich bekomme dann eine Fehlermeldung:
Can't declare scalar dereference in my at ./test.pl line 6, near "} ="
sorry, ich meinte natürlich: ${"a_$i"}
$ perl -Mstrict -we 'for my $n (0..10){ ${"a_$n"} = $n; }' Can't use string ("a_0") as a SCALAR ref while "strict refs" in use at -e line 1. Hannes, du solltest ein Array oder, je nach Anwendung, auch ein Hash verwenden... ==== perldoc -q "variable name" ==== How can I use a variable as a variable name? [..] This works sometimes, but it is a very bad idea for two reasons. The first reason is that this technique only works on global variables. [..] The other reason why using a variable to hold the name of another variable is a bad idea is that the question often stems from a lack of understanding of Perl data structures, particularly hashes. ==== -dnh -- "I think there is a world market for maybe five computers." -- Thomas Watson, chairman of IBM, 1943. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Daivd, Am Tag 07-07-04 zur Zeit 17:10:17 schrieb David Haller:
Hallo,
Am Mit, 04 Jul 2007, Dr. Jürgen Vollmer schrieb:
Am Mittwoch, 4. Juli 2007 schrieb Hannes Vogelmann:
Am Tag 07-07-04 zur Zeit 15:14:32 schrieb Dr. Jürgen Vollmer: [..]
my ${a_$i} = $n;
hmm, so geht das leider nicht. Ich bekomme dann eine Fehlermeldung:
Can't declare scalar dereference in my at ./test.pl line 6, near "} ="
sorry, ich meinte natürlich: ${"a_$i"}
$ perl -Mstrict -we 'for my $n (0..10){ ${"a_$n"} = $n; }' Can't use string ("a_0") as a SCALAR ref while "strict refs" in use at -e line 1.
Hannes, du solltest ein Array oder, je nach Anwendung, auch ein Hash verwenden...
[...] Du hast natürlich recht, ich sehe es ja schon ein, allerdings muss ich dann dafür sorgen, dass meine a_n schon als @array geboren werden. Das macht die Sache auch nicht komplizierter, sondern vereinfacht sie sogar in gewisser Weise. Allerdings muss ich halt an der Struktur nochmal basteln. Einfach Variablen in den Variablen-Namen einzubauen schien mir halt die schnellste quick-and-dirty Lösung zu sein. cu Hannes -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
* Hannes Vogelmann
Ich habe eine Schleife, die den Variablen a_0 bis a_9 die Werte 0 bis 9 zuweisen soll. Sinngemäß also:
for ($n = 0; $ < 10; $n++) { my $a_n = n; weitere Befehle; }
So geht es natürlich nicht, weil das "n" in "a_n" nicht dem $n entspricht und so nur jedesmal "a_n" neu definiert wird.
Bist du sicher dass du kein Array willst? Es ginge aber mit eval. Gruß, Bernhard -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Tag 07-07-04 zur Zeit 16:30:50 schrieb Bernhard Walle:
* Hannes Vogelmann
[2007-07-04 15:03]: Ich habe eine Schleife, die den Variablen a_0 bis a_9 die Werte 0 bis 9 zuweisen soll. Sinngemäß also:
for ($n = 0; $ < 10; $n++) { my $a_n = n; weitere Befehle; }
So geht es natürlich nicht, weil das "n" in "a_n" nicht dem $n entspricht und so nur jedesmal "a_n" neu definiert wird.
Bist du sicher dass du kein Array willst? Es ginge aber mit eval.
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. In einem Fall gibt es die Variablen a_n bereits und ich muss diese einfach nur ansprechen können ohne sie explizit beim Namen zu nennen. Welches a_n aufgerufen werden soll, richtet sich nach einem index $n der wie auch immer als Skalar vorliegt. Gruß, Hannes -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
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
Am Tag 07-07-04 zur Zeit 17:57:19 schrieb Torsten Foertsch:
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.
inzwischen weiß ich vor allem, welche Probleme man sich damit an Land ziehen kann ;-) Vielen Dank für die ausführliche Beschreibung. Ich habe mal ein wenig herumprobiert und bin dann doch recht schnell bei der Erkenntnis gelandet, dass ein @array die Sache wesentlich eleganter löst, zumal die a_n global verwendet werden und nicht nur in der Schleife leben, in der sie aufgerufen werden. [...]
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
Aber da habe ich ja dann gerade dass, was ich vermeiden wollte, und ich muss die Variablen explizit beim Namen nennen und kann den Namen nicht aus der for (...) Schleife generieren. cu Hannes
participants (5)
-
Bernhard Walle
-
David Haller
-
Dr. Jürgen Vollmer
-
Hannes Vogelmann
-
Torsten Foertsch