in reply to Re: cpan install($_) doesn't work in loop, but normal lexical var does
in thread cpan install($_) doesn't work in loop, but normal lexical var does

The magic of $_ is too fragile for anything but simple cases in my opinion.
Yes, but it's the authors of CPAN modules that should be watching out for this, not the users of the modules.

Something I've wondered about off-and-on: is there any compelling reason not to do a "local $_;" at the beginning of every subroutine, unless you're relying on a value being passed in via $_? Why isn't this one of our "best practices"?

  • Comment on Re^2: cpan install($_) doesn't work in loop, but normal lexical var does

Replies are listed 'Best First'.
Re^3: cpan install($_) doesn't work in loop, but normal lexical var does
by starbolin (Hermit) on Aug 28, 2006 at 00:23 UTC

    "...is there any compelling reason not to do a "local $_;" at the beginning of every subroutine?"

    Yes, doesn't fix the problem. Any time you call a function, subroutine or method it could blow away $_. And you will never have control of other peoples code so if you rely on $_ not being hosed you'll eventually get burnt. Far better is to practice defensive programing and not rely on $_ after all the perl syntax in all cases allows you to specify something other that the default input/output scalar.


    s//----->\t/;$~="JAPH";s//\r<$~~/;{s|~$~-|-~$~|||s |-$~~|$~~-|||s,<$~~,<~$~,,s,~$~>,$~~>,, $|=1,select$,,$,,$,,1e-1;print;redo}
      "...is there any compelling reason not to do a "local $_;" at the beginning of every subroutine?"
      Yes, doesn't fix the problem. Any time you call a function, subroutine or method it could blow away $_. And you will never have control of other peoples code so if you rely on $_ not being hosed you'll eventually get burnt.
      And by the same token, if you're a module author, you have no control over your user's code, and if you're stomping on $_, eventually one of them will be burned by it.

      So if you don't want to burn your users, you should always localize $_.

        Agreed!

        After I posted I was rethinking along those lines. Perl really makes it too easy to missuse globals. Anytime we are writing modules proper technique demands that we don't use any globals but there that default input/output space thing there just waiting to be defaulted to. I know that in the past I haven't thought about it much. Now that I have thought about I'm thinking I ought to write a test I could use on all modules in my system to check for abuse of $_.

        But then another part of me says, "It's just that, a global." Anyone can use it. Who's fault is it. The guy who use it in a subroutine or me who relied on it not being used?

        I'm in a quandry.

        Quandered in the Monastary; starbolin


        s//----->\t/;$~="JAPH";s//\r<$~~/;{s|~$~-|-~$~|||s |-$~~|$~~-|||s,<$~~,<~$~,,s,~$~>,$~~>,, $|=1,select$,,$,,$,,1e-1;print;redo}