Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: Putting an array into a hash gives an unexpected reference to the hash itself.

by AnomalousMonk (Abbot)
on Nov 08, 2012 at 03:05 UTC ( #1002796=note: print w/ replies, xml ) Need Help??


in reply to Putting an array into a hash gives an unexpected reference to the hash itself.

... I am still puzzled as to why I got a reference to the hash value 'email' => $services{'service1'}{'email'} rather than a reference to say 'email' => $maintainers[0];

The problem is that  Dump() does not 'know' that the reference that is the value of both  $services{service1}{email} and  $services{service2}{email} derives from the  @maintainers array, i.e.,  \@maintainers   (not the  $maintainers[0] array element). All  Dump() 'knows' is that one reference in the data structure it is analyzing (by recursive traversal of a tree of references!) is the same as another, and it tries to let you know (without quotation marks) this because it's probably significant. (Perl has a great deal of introspective ability, so it might be possible (but probably not – see Update below) to make a function like  Dump() smart enough figure out the name of the original referent (if it ever had and still has a name!), but if it is, the author of the module didn't know about the possibility or didn't care to make use of it.)

Update: OTOH, it's easy to imagine situations in which the original name of a variable is gone beyond even the ability of PadWalker to access it. In the example below (don't try this at home: bug: dependence on execution order), the name of the lexical  @ra array is, I believe, absolutely gone upon exit from the scope in which it is defined, but the data lives on as long as there is a reference to it.

>perl -wMstrict -le "use Data::Dumper; ;; { my @ra = qw/ worker@company.com manager@company.com /; sub AR { return \@ra; } } ;; my %services = ( service1 => { email => AR() }, service2 => { email => AR() }, ); ;; print Data::Dumper->Dump( [ \%services ], [qw/*services/] ); " %services = ( 'service1' => { 'email' => [ 'worker@company.com', 'manager@company.com' ] }, 'service2' => { 'email' => $services{'service1'}{'email' +} } );


Comment on Re: Putting an array into a hash gives an unexpected reference to the hash itself.
Select or Download Code
Re^2: Putting an array into a hash gives an unexpected reference to the hash itself.
by choroba (Canon) on Nov 08, 2012 at 15:38 UTC
    I doubt Data::Dumper inspects any variable names. It just uses what you give it - or VAR1, VAR2 if it gets nothing.
    لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      I doubt Data::Dumper inspects any variable names.

      It doesn't (as far as I know), and my code example would have been clearer had I not supplied a variable name to  Dump() in contrast to the OP. I just wanted to make the points that  Data::Dumper tries to emphasize repeated references within the data structure it's dumping (as these are usually important), and that even if one could sometimes recover the name of a reference, it probably wouldn't be worth doing.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1002796]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (8)
As of 2015-07-06 22:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (83 votes), past polls