[Vienna-pm] create reference from string?

Roland Giersig rgiersig at cpan.org
Mon Jan 12 10:03:45 PST 2009


Nein, es gibt keine Möglichkeit, eine stringifizierte Referenz wieder zu 
entstringifizieren. Schaut nach einem Bug in Net::IMAP::Client aus, der 
Autor hat vielleicht beim Zusammenbauen des Hashes key und value 
verwechselt. Edit: Ich hab mir kurz den Code von Net::IMAP::Client v0.6 
angesehen, schaut eigentlich ganz OK aus, kein offensichtlicher 
"Dreher". Poste mal deinen Test-Code...

LG, Roland

PS: weiterführende Dokumentation für Interessierte:

perldoc perlfaq4

How can I use a reference as a hash key?

(contributed by brian d foy)

Hash keys are strings, so you can’t really use a reference as the key. 
When you try to do that, perl turns the reference into its stringified 
form (for instance, "HASH(0xDEADBEEF)"). From there you can’t get back 
the reference from the stringified form, at least without doing some 
extra work on your own.
Also remember that hash keys must be unique, but two different variables 
can store the same reference (and those variables can change later).

The Tie::RefHash module, which is distributed with perl, might be what 
you want. It handles that extra work.


peter pilsl wrote:
> Ich hab ein verzwicktes Problem.  Ein Modul (von CPAN) sollte auf eine
> bestimmte Methode als Ergebnis eine Hashreferenz zurückliefern mit
> id-nummern als keys, die wieder auf array-refs zeigen, also
> 
> id1 => ARRAYREF1,
> id2 => ARRAYREF2,
> usw.
> 
> stattdessen erhalte ich zB:
> 
> {
>   'ARRAY(0xb3f090)' => '623975'
> };
> 
> und der key 'ARRAY(0xb3f090)' ist ein string   (ref() auf den key ergibt
> den leerstring, also keine reference.
> 
> Nun gibt es zwei Möglichkeiten:
> 
> i) entweder ich versteh da einfach was nicht
> ii) im Modul ist ein bug und da lauft einfach was schief.
> 
> nach viel nachdenken bin ich derzeit eher zu Variante ii) geneigt und
> bevor ich mir jetzt den modul-code vornehm und/oder einen bug-report
> schicke, frage ich mich, obs eine Methode gibt, den string
> 'ARRAY(0xb3f090)' zu un-dereferenzieren (?), sodass ich Zugriff aus das
> Array bekomme, das hier beschrieben wird.
> 
> Dann könnt ich nämlich mal schauen, ob dort das drinnen ist was ich
> erwarte und wüsste auch besser, wonach ich beim debuggen eigentlich
> suchen müsste.
> 
> Hoffe, ich hab mein problem halbwegs klar beschrieben :)
> 
> 
> kurzversion wäre:
> 
> $a=[1,2,3];
> $b=$a."\n";
> chomp $b;
> # $b ist nun ein echter string
> print $b," ",ref($b),"\n";
> 
> Und dann will ich von $b wieder auf das array [1,2,3], natürlich ohne $a
> zu verwenden ...
> 
> 
> danke
> lg
> peter
> 
> 
> ps: das modul mit dem ich dieses problem hab ist Net::IMAP::Client und
> die Funktion get_flags()
> 
> 
> 


More information about the Vienna-pm mailing list