My question to you wise and wonderful monks is whether I should return a hash or a hash reference.

Why lock your users into only one option? Thats not the perl way to do things.

If their code makes more sense with a ref then give them one, if it makes more sense to get a list of key=>value pairs then give it to them.

I avoid the term "to get a hash" as there is no way to return a hash from a subroutine. Instead the hash must be listified into key=>value pairs and then returned that way. Its up to the user to shove that list into an actual hash (or not).

And since this approach involves returning a list then good old perlfunc:wantarray comes to the rescue:

sub get_params { my $self = shift; my %input; $input{$_} = $self->{$cgi_handle}->param($_) foreach $self->{$cgi_handle}->param()); # we return a hashref if the user calls us in scalar context # or a list of key=>values pairs if they call us in list context. return wantarray ? %input : \%input; }
Incidentally this is a standard idiom that can come in very useful. Consider the behaviour of localtime(). You could even insert the following before the return statement
die "get_params in void context:".Dumper(\%input) unless defined wan +tarray;
to provide a debugging behaviour for when the sub is called in void context.

HTH

--- demerphq
my friends call me, usually because I'm late....


In reply to Re: Subroutines: Returning a hash vs. hash reference by demerphq
in thread Subroutines: Returning a hash vs. hash reference by mt2k

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.