Variablennamen dynamisch erzeugen....WIE???
Tina
- perl
0 Peter Kaufmann0 Tina
Hallo alle miteinander!
Ich würde gerne Array-Variablennamen dynamisch erzeugen....
d.h. z.b. @ITEM1, @ITEM2, etc.
Das mit $ITEM[1], etc. ist für mich und dem Problem keine Lösung...
Ich brauch auf jeden Fall neue Array-Namen...
Gruss,
Tina
Hallo Tina,
Ich würde gerne Array-Variablennamen dynamisch erzeugen....
d.h. z.b. @ITEM1, @ITEM2, etc.
Das mit $ITEM[1], etc. ist für mich und dem Problem keine Lösung...
Ich brauch auf jeden Fall neue Array-Namen...
das geht theoretisch (und praktisch) mit
@{"ITEM$i"} = ("foo","bar");
Es ist aber extrem schlechter Still das so zu machen! Wahrscheinlich löst dein Problem auch ein 2 dimensionales Array oder ein Hash mit Referenzen auf verschiedene Arrays - mir fällt auf jeden Fall kein Anwendungsfall ein wo das nicht ginge ...
siehe auch http://selfhtml.teamone.de/cgiperl/sprache/listen.htm#mehrdimensionale und http://selfhtml.teamone.de/cgiperl/sprache/referenzen.htm#auf_arrays
Grüße,
Peter
Ich habe folgendes Problem:
ich habe ein Array z.B. @ITEM in dem Werte stehen.
Nun will ich auf diesen Array eine Referenz setzen und danach auch eine Manipulation vornehmen.
Allerdings möchte ich die Manipulation immer an einer anderen Stelle vornehmen. Somit würde ich immer ein und dasselbe Array manipulieren, was ja nicht der Sinn der Sache ist.
Es soll immer ein neues Array mit der neuen Änderung vorhanden sein.
Gruss,
Tina
ich habe ein Array z.B. @ITEM in dem Werte stehen.
Nun will ich auf diesen Array eine Referenz setzen und danach auch eine Manipulation vornehmen.
Allerdings möchte ich die Manipulation immer an einer anderen Stelle vornehmen. Somit würde ich immer ein und dasselbe Array manipulieren, was ja nicht der Sinn der Sache ist.
Klingt irgendwie kompliziert unsd ohne Beispiel code auch schwer zu sagen, was du wirklich willst.
Für mich klingt es so, das du eine arrayrefrenz an eine Funktion übergibst, das Array ändern möchtest, aber nuir lokal in der sub.
Dazu musst du dir nur eine Kopie anlegen.
#!/usr/bin/perl -w
use Data::Dumper;
my @ITEM = qw/1 2 3 4 5/;
my @new = func (@ITEM);
sub func
{
my @lokal = @{ $_[0] };
push @lokal, 'neu';
return wantarray ? @lokal : @lokal;
}
print 'neu:'. Dumper(@ITEM);
print 'alt:'. Dumper(@new);
Struppi.
Das klinkt echt gut...
Habe aber leider noch Verständnisprobleme...
folgendes:
keine SUB-Routine, sondern einfach nur innerhalb einer SUB
Ich habe ein Array @ITEM, welches unverändert bleiben soll....
jetzt möchte ich aber auf dieses Array eine Referenz, und danach will ich manipulieren....aber das @ITEM soll trotzdem unverändert bleiben...
Gruss,
Tina
use Mosche;
keine SUB-Routine, sondern einfach nur innerhalb einer SUB
Ich habe ein Array @ITEM, welches unverändert bleiben soll....
jetzt möchte ich aber auf dieses Array eine Referenz, und danach will ich manipulieren....aber das @ITEM soll trotzdem unverändert bleiben...
Ja, warum kopierst du dir deinen Array denn nicht einfach?
use Tschoe qw(Matti);
Habe glaube ich jetzt das größte Problem lokalisiert....
Wenn ich folgendes mache:
for my $i (0..12) {
@{"ITEM$i"} = @array_alt;
...
}
funktioniert das auch, bis auf das das ich in dem Array (alt) in jedem Listenelement wiederum einen Hash habe....z.B. mit der Nummer HASH(0x8dec31c).....
dies bedeutet, dass in @ITEM0, @ITEM1, etc. immer derselbe HASH-Speicherplatz steht und wenn ich dann den HASH im Array manipuliere, dann ändert er es in jedem anderen ARRAY auch...
Wie kann ich also nun den Speicherplatz ändern....
Gruss,
Tina
Wenn ich folgendes mache:
for my $i (0..12) {
@{"ITEM$i"} = @array_alt;
...}
Ich versteh nach wie vor nicht warum.
Was stört dich an $ITEM[$i]?
funktioniert das auch, bis auf das das ich in dem Array (alt) in jedem Listenelement wiederum einen Hash habe....z.B. mit der Nummer HASH(0x8dec31c).....
dies bedeutet, dass in @ITEM0, @ITEM1, etc. immer derselbe HASH-Speicherplatz steht und wenn ich dann den HASH im Array manipuliere, dann ändert er es in jedem anderen ARRAY auch...
Logisch, wenn du referenzen kopierst und diese änderst ändert sich auch das Orginal. Das ist der Sinn und Zweck von Referenzen.
Wie kann ich also nun den Speicherplatz ändern....
Das willst du nicht, du willst ein Kopie anlegen. Je nach Datentyp unterschiedlich. Entweder
ARRAY: @{ $ref }
HASH: %{ $ref }
Struppi.
Habe glaube ich jetzt das größte Problem lokalisiert....
Wenn ich folgendes mache:
for my $i (0..12) {
@{"ITEM$i"} = @array_alt;
...
}
funktioniert das auch, bis auf das das ich in dem Array (alt) in jedem Listenelement wiederum einen Hash habe....z.B. mit der Nummer HASH(0x8dec31c).....
dies bedeutet, dass in @ITEM0, @ITEM1, etc. immer derselbe HASH-Speicherplatz steht und wenn ich dann den HASH im Array manipuliere, dann ändert er es in jedem anderen ARRAY auch...
Wie kann ich also nun den Speicherplatz ändern....
Gruss,
Tina