Beefy Boxes and Bandwidth Generously Provided by pair Networks Cowboy Neal with Hat
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re^2: Perl cheat sheet

by ikegami (Pope)
on Aug 21, 2006 at 19:32 UTC ( #568659=note: print w/ replies, xml ) Need Help??


in reply to Re: Perl cheat sheet
in thread Perl cheat sheet

"$foo" creates a stringified copy of $foo. $foo will get stringified when it needs to get stringified. There's no reason to do it prematurely. For example, it prevents people from using object with stringification overloaded.


Comment on Re^2: Perl cheat sheet
Select or Download Code
Re^3: Perl cheat sheet
by ursus (Acolyte) on Jan 07, 2009 at 00:50 UTC
    Globals are an important exception here. If you log($!), you may easily have a clobbered $! by the time you use it. log("$!") gets a snapshot of the variable at the time of the call.

      That's something most people will never need to know.

      The problem is that new programmers love to put *everything* in quotes. While it's a bad idea to pass global (lexical and package) variables as arguments, that is probably not a problem you'll ever run into. Just about every sub already creates a copy of the value before it can change.

      sub logger { my ($arg) = @_; # The copying happens here, so ... # no need to do it in the caller. }

      One could even argue it's the sub's responsibility to protect global variables it changes if it uses @_ at any other point.

        Sometimes I forget that "never" means "you probably don't want to". ;-) Next time I'm in that code, I'll make it the responsibility of the called function. Thanks.

      $! was an unfortunate choice of variable. :-) It's a dualvar so it has different values if treated as a string or as a numerical.

      open my $fh, '<', 'this does not exist'; printf "%s (%d)\n", $!, $!; __END__ No such file or directory (2)
      It's better to just create a copy and pass that, if the subroutine doesn't copy the argument.

      lodin

        The example was fine. It doesn't make sense for logger to need the dualvar.

        • If you wanted to pass the error string to the sub, the caller would use "$!".
        • If you wanted to pass the error number to sub, the caller would use 0+$!.
        • If the sub needs both an error string and an error number, it would take two arguments.
        • If the sub wants to look at $!, it wouldn't take it as an argument.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (6)
As of 2014-04-20 13:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (485 votes), past polls