Deficiency

jdavidb on 2002-06-17T18:56:30

I have a hash of hashes. Slices in this context are notably underrepresented in the Perl literature I've consulted (POD's and Camel).

I've done this before, but always by experimentation. Time has taught me not to depend on something I've only learned by verifying against an implementation.


And this is how to do it:

jdavidb on 2002-06-17T19:04:26

$hash{hash} = {five => 5, six => 6, seven => 7};
@vals = @{$hash{hash}}{qw(five seven)};

Note, don't make the mistake of

@vals = $hash{hash}->{qw(five seven)};
which parses correctly but does not give you what you're looking for.

I don't think I'd even know about slices if it weren't for the warning you get with @array[$i].

Testing against implentations

Dom2 on 2002-06-18T08:39:35

One of my beefs about perl is that it doesn't come with a good interactive environment (unlike python). I frequently test things against an implementation, just to see whether something works or not; I usually go to the documentation afterwords. :-)

I must say though, that hash slices are one of those things that I nearly always avoid if possible; they're just too visually cluttered.

Re:Testing against implentations

jdavidb on 2002-06-18T13:04:59

It's not a very good interactive environment, but you can use the debugger with a command like perl5.6.1 -de 1. I do it often, including yesterday when playing with slices.

I haven't completely decided if I should avoid hash slices or not. I'll agree they seem cluttered. I'll have to wait until I'm maintaining this code three years from now to decide. :) For now I'm using them because they seem less cluttered than the alternative.

Re:Testing against implentations

pudge on 2002-06-18T15:15:49

I don't understand what you mean. Yes, there is perl -d, as mentioned, and you can always use perl -e itself, too. But not knowing what you mean, I can't say if these are sufficient to your desires.

Testing is sometimes a problem. For testing Slash, I wrote Slash::Test, which exports the four major objects, Dumper(), the entire API, all the constants, all the available plugin objects, etc. so I can do stuff like:
% perl -MSlash::Test=useperl -e 'print Dumper $slashdb->getUserFoo($user->{uid})'
Everything I need is right there, so I don't need to bother setting it up, and testing little snippets is very simple. I can test templates, too:
% perl -MSlash::Test=useperl -eDisplay
[% USE Dumper; Dumper.dump( Slash.db.getUserFoo(user.uid) ) %]
^D
etc.

Testing environments are important, but if perl doesn't have one you need, it's not too hard to write one to suit your own purposes.

As to hash slices, I use them sparingly, usually only when other methods are more cluttered.

Re:Testing against implentations

torin on 2002-06-18T16:20:05

There are a few different interactive environments out there including the perl -dead that folks have mentioned.
For interactive exploration of complex structures, I've found Data::Walker to be very useful.