Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re^2: Why doesn't Perl provide %_ as the hash equivalent of @_ in subs? (ugly++)

by smls (Friar)
on Sep 27, 2013 at 09:37 UTC ( #1055950=note: print w/ replies, xml ) Need Help??


in reply to Re: Why doesn't Perl provide %_ as the hash equivalent of @_ in subs? (ugly++)
in thread Why doesn't Perl provide %_ as the hash equivalent of @_ in subs?

"Please oh please don't require people to search the entire code of your routine in order to figure out what parameters can be passed to it!"

Yes, it wouldn't make sense to use %_ in most long & complicated routines.

I never intended to suggest that it would become The One True WayTM for accessing subroutine arguments.

I just think it would be a useful additional tool in the Perl developer's toolbox, nicely complementing the existing ones (in particular @_ which it would semantically mirror very closely), to be deployed with discretion.

I myself would use %_ sparingly, just like I currently use direct access to $_[0] (or, similarly, $_ in foreach loops) sparingly. But sparingly does not mean "never useful"!
Remember that Perl is also popular for shell one-liners & small system administration/convenience scripts etc., not just for huge professional web applications. And not every subroutine is so big and complicated, that direct usage of @_ or %_ would get lost in the noise or make it impossible to predict unwanted side-effects.

Example:

In the OP I've already given a use-case that can appear even in big Perl applications, where I think %_ has its place - let me elaborate on that:
When you have, say, a module which offers functionality for which it takes a whole set of related callback functions, which when called should get access to a set of variables (but as the module author you can't predict which variables will actually be used by which user callback), then passing a hash makes sense. Now if, in the user code, the callbacks turn out to be very simple and short (say, <1 line each), then copy&pasting the same boilerplate between all of them for unpacking the parameters into a hash just adds noise - "less sexy" in this case also means "less readable".

Precedent:

Besides @_, the use of %_ as I imagine it can be compared to the use of $_ in foreach loops.
The "safe", "clean", "text-book" way is to declare an explicit loop variable, and in most cases that does indeed makes sense:

foreach my $person (@people) { ## ... ## Long and complex code that uses $person many times, might ## potentially be refactored into nested loops in the future, etc. ## ... }

Using $_ instead of $person in that example would entail many of the same or similar disadvantages/problems as the ones that you and other commenters have invoked against the use of %_ in subs.

And yet, Perl does make $_ available as a built-in language feature.
And I, for one, happily use it to make code shorter and cleaner in those cases where it doesn't hurt, e.g.:

say $_->{name} foreach @people;
$age_sum += $_->{age} foreach @people;

Perl trusts me to make an informed decision when to use $_ and when not. The fact that it can be used in ways that make code unreadable or buggy, wasn't deemed enough of a reason to exclude it from the language.

Why not apply the same principle to %_?


Comment on Re^2: Why doesn't Perl provide %_ as the hash equivalent of @_ in subs? (ugly++)
Select or Download Code
Re^3: Why doesn't Perl provide %_ as the hash equivalent of @_ in subs? (ugly++)
by BrowserUk (Pope) on Sep 27, 2013 at 10:01 UTC
    Why not apply the same principle to %_?

    Because $_ costs (almost) nothing to provide; so people not using it do not pay a penalty for those that do.

    Setting up a hash from an arbitrary list of value would require substantial extra validation to see if doing so made any sense -- are there an even number; does the first of each pair make sense as a key etc. -- then building the hash and aliasing the hash values to the input arguments etc.

    That is a substantial penalty for everyone who doesn't used that hash to pay, for the convenience of the few that would.

    If you want that facility, do it yourself, cos I have no use for it and I don't want to pay the penalty.


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      If it would make all function calls slower, then I agree with you that it wouldn't be worth it.

      But does that really have to be the case?
      choroba suggested above that the hash could be built when first used... Would that not be technically feasible?

        Like with $&, $`, $' you would only have a performance hit if you actually used it.

        If it would make all function calls slower, then I agree with you that it wouldn't be worth it.

        3 times slower...

        sub withNames{ local %_ = @_; ++$_{$_} for keys %_; };; sub sansNames{ ++$_ for @_; };; cmpthese -1,{a=>q[ withNames( 1 .. $_*2 ) for 1..5 ], b=>q[ sansNames( + 1..$_ ) for 1 .. 5 ] };; Rate a b a 32135/s -- -75% b 127549/s 297% --
        hash could be built when first used... Would that not be technically feasible?

        Feasible, yes.

        A good idea? Sounds like a recipe for disaster to me.

        And all to save you adding local %_ = @_; where you want it. Worth the effort? Absolutely not.


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (4)
As of 2014-09-20 02:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (152 votes), past polls