in reply to slurp

Besides btrott's objections, setting a magic variable (the ever-lovable $/) that way is a recipe for debugging disaster!

Because the magic variables are relatively global, a change in one forgotten corner of your program somewhere can have far-reaching effects on other code. For example, if I were to write the (habitual) code thusly:

open (INPUT, $filename) || die "Can't open $filename: $!"; while (<INPUT>) { hack($_); slice($_); dice($_); vacuum_seal($_); } close INPUT || die "Wow, we're in for it now: $!";
I assumed that the Input Record Separator ($/) was set to its default of "\n", as it almost always is. If I had called your subroutine earlier, it wouldn't be set to that.

Imagine the pain and suffering if that were in a module.

The solution is twofold. First, use local. This is one of the few places where it's absolutely necessary. Second (related to the first), place the entire code in a block -- that way, the local copy of $/ will be in effect only for that block, and the normal value will be in effect everywhere else.

Replies are listed 'Best First'.
RE: RE: slurp
by Adam (Vicar) on Jun 20, 2000 at 00:31 UTC
    That's a REALLY good point chromatic, but I wanted to emphasize the second half of your "twofold solution" which is to put the code in a block. This is very important, because otherwise your usage of local will still be relatively global.