in reply to Hashes as return values

Thanks for all the great wisdom! Everything works almost perfectly now. One other quick question if you don't mind, though. Is there any prettier syntax than:
%{ $config->acls }->{$_}
to return the value during the foreach loop? Or should I just stick with the while loop if I want pretty code? Thanks again!

Replies are listed 'Best First'.
Re^2: Hashes as return values
by thedoe (Monk) on Jan 17, 2006 at 18:14 UTC

    If you would like something more pretty, I would recommend assigning the return value into a hashref then looping over that:

    my $loopHashRef = $mod->acls; foreach (keys %$loopHashRef) { print $loopHashRef->{$_}; }

    If you like, you could also assign the return value directly into a hash and loop over that:

    my %loopHash = %{$mod->acls}; foreach (keys %loopHash) { print $loopHash{$_}; }

    Update: Fixed a sigil - *grumble* copy+paste mistakes... *grumble*

Re^2: Hashes as return values
by blazar (Canon) on Jan 17, 2006 at 18:34 UTC

    I wouldn't have even expected that to work. Briefly: $config->acls returns a hashref. So far so fine. You can dereference it with

    my %hash = %{ $config->acls }; # to get a full hash, # and my $item = $config->acls->{thatkey}; # to get a single element.

    Now the first element is possibly a bit deceiving, because it would work even if the hashref was "converted" to the flattened list of its pairs, whereas the rvalue is a hash at all effects, so that it can directly used e.g. with each and keys, like it was already explained to you.

    Whatever, accessing elements as per the second example, still involves method calls, and although I, like so many others, recommend all the time not to bother about alleged optimizations, that feels somewhat unsatisfactory. Personally, I'd just assign to a suitably lexically scoped hash say, %tmp for convenience. YMMV.