Thread array in hash erweitern (23 answers)
Opened by jan99 at 2010-09-03 12:59

pq
 2010-09-03 13:42
#141140 #141140
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
2010-09-03T10:59:27 jan99
das problem liegt in der zeile

Code (perl): (dl )
%id_keys{$key} = push(%id_keys{$key},{$obj->type.$obj->id()});

das sehe ich auch so.
was soll die zeile tun? erstmal sollte man klarstellen: ist das perl5, was du hier willst?
in perl5 schreibt man, um auf einen wert im hash %foo zuzugreifen, $foo{$key} und nicht %foo{$key}. letzteres kompiliert nämlich gar nicht. wie hast du das geschafft, dass perl das akzeptiert?

ab hier nehme ich mal an, man schreibt es richtig:
$id_keys{$key} = push $id_keys{$key}, {$obj->type . $obj->id()};

nächstes problem: push erwartet als erstes argument ein array. du gibst ihm aber einen wert aus einem hash.
lies mal http://p3rl.org/perlreftut und http://p3rl.org/perldsc

ich vermute einfach mal, in $id_keys{$key} soll eine hasharrayreferenz stehen. dann musst du die derefenzieren:

$id_keys{$key} = push @{ $id_keys{$key} }, {$obj->type . $obj->id()};

drittens habe ich ein problem damit, zu verstehen, was eine zuweisung an $id_keys{$key} soll, wenn du im gleichen statement der arrayref in $id_keys{$key} etwas zuweist. das macht die arrayreferenz komplett zunichte.
vereinfacht:
$aref = push @$aref, 23;
mach dir das mal klar. du fügst der arrayref $aref einen neuen wert hinzu, die 23, und im selben statement weist du dann der arrayref das ergebnis des push zu. das ergebnis eines push ist in dem fall die 23, also danach steht in $aref die 23 eine 1, und danach steht in $aref die 1 und es ist keine arrayref mehr.

so und viertens habe ich keine ahnung, was das hier sein soll:
{$obj->type . $obj->id()}
{ ... } erstellt eine hash-referenz, aber was du da drinhast, ist einfach nur ein zusammengesetzter skalar. was für einen sinn soll da ein hash haben?


erklär vielleicht einfach mal in deutsch statt in perl, was du machen willst.
wie du siehst, kann man als leser teilweise vielleicht erraten, was für fehler du gemacht hast, aber beim letzten problem wird dann echt unklar, was das eigentliche ziel war. das statement enthält mehr fehler als eigentlich funktionierenden code.

edit: typos
edit2: s/hash/array/, ergebnis von push
Last edited: 2010-09-03 18:16:31 +0200 (CEST)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread array in hash erweitern