PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anonymer Hash, mehrere Werte zu einem Key


z-shell
24.08.2008, 14:45
Hallo,
ich habe folgende anonyme Arrays:
$rucksack=["Wasser","Apfel","Ring","Fleisch"];
$waffen=["Stock","Schwert","Axt"];
$ruestung=["Hose","Hemd","Baumwollschuhe","Lederhose","Lederhemd","Lederhandschuhe","Kettenhemd"];
Und einen anonymen Hash:
$char={
Rucksack=>$rucksack->[0],
Waffe=>$waffen->[0],
Ruestung=>$ruestung->[0]
};
Auf die einzelnen Elemente greife ich mit
print "Ihr habt folgende Waffe:\n";
print "$char->{Waffe}\n";
usw. zu.
Jetzt brauche ich natürlich für "Rucksack" und "Rüstung" mehrere Inhalte.
Kann ich den Keys im anonymen Hash nicht mehrere Werte mitgeben? Sowas in der Art:
$char={
Rucksack=>$rucksack->[0],$rucksack->[1],
Waffe=>$waffen->[0],
Ruestung=>$ruestung->[0]
};

Dabei wird nur das erste Element angezeigt.
$char={
Rucksack=>$rucksack->[0]->$rucksack->[1],
Waffe=>$waffen->[0],
Ruestung=>$ruestung->[0]
};
Dabei bekomme ich die Meldung:
Can't locate object method "ARRAY(0x8c390b8)" via package "Wasser" (perhaps you forgot to load "Wasser"?) at ./rollenspiel.pl line 34.
$char={
Rucksack=>$rucksack->[0][1],
Waffe=>$waffen->[0],
Ruestung=>$ruestung->[0]
};
Dabei bekomme ich:
Use of uninitialized value in concatenation (.) or string at ./rollenspiel.pl line 133, <STDIN> line 2.
Gibts da eine Lösung für? Oder muss ich an die Sache ganz anders rangehen?


Tar-Minyatur
24.08.2008, 14:49
Da brauche ich nichtmal Ahnung von Perl, um dir sagen zu können, dass das so nicht hinhaut. Ein Rucksack ist doch quasi nur eine Sammlung von Zeug. Genauso wie deine Arrays mit den Waffen auch nur ne Sammlung von Zeug ist. Und wieso repräsentierst du die unterschiedlich, obwohl sie im Prinzip doch das gleiche sind?

Alamar
24.08.2008, 14:51
Ich bin mir nicht ganz sicher was du willst, mag daran liegen dass ich noch am ausnüchtern bin ;)
So nun zum Thema, du kannst in deinem Hash den Keys immer nur einen einzigen Wert zuordnen - du kannst aber natürlich die Inhalte verschiedener Variablen zu einem einzigen String "concatenaten" ;)

$foo => $bar->[0] . " " . $bar->[1];

Wenn jeder Char seinen eigenen Rucksack Array hat kannst du jedoch einfach direkt in der Hash definition für Rucksack die Referenz auf den Array übernehmen.

Rucksack => $rucksack,
und dann per $char->{Rucksack}->[index] auf die einzelnen Indexe zugreifen.

z-shell
24.08.2008, 15:37
Ich bin mir nicht ganz sicher was du willst,
Also:
Es soll ja offensichtlich ein Rollenspiel werden.
Ich brauche also eine bzw. mehrere Liste(n) von Gegenständen, die generell Verfügbar sind. Einige davon sind nur am Anfang des Spiels dem Char verfügar, andere erst im Verlauf des Spiels. Einige Gegenstände kommen dazu, andere werden Entfernt. Die Liste bleibt aber immer die Gleiche. Es soll immer nur die Variable $char verändert werden.
Wer Lust hat, kann sich das ganze Script mal ansehen. Ich habe es mal als tar.gz in 3 Versionen aufm server gepackt:
>klick< (http://zshell.zs.ohost.de/rollenspiel/)
Bis dahin probiere ich noch ein paar Sachen aus.

Danke erstmal für die Vorschläge.

z-shell
24.08.2008, 17:09
du kannst aber natürlich die Inhalte verschiedener Variablen zu einem einzigen String "concatenaten"

$foo => $bar->[0] . " " . $bar->[1];
Die Idee ist gut. :)
Ich hab nochmal jeweils eine neue Variable angelegt:
$char_ruck=$rucksack->[0].",".$rucksack->[1];
und greife so darauf zu:
print "$char_ruck\n";

Dann brauche ich immer nur $char_ruck etc verändern.

Vielen Dank!

/edit: kann man das Thema irgendwo als gelöst markieren?