in reply to Re: Re: where do you put your subs
in thread where do you put your subs

The parens/ampersand are not much of a real problem. The unintended globals are! If you declare a lexical in the body of your script, and you have the subs declared after that, those subs can access the lexical, thus having global-like behaviour (in a way). A very, very good programming concept is to keep things to yourself if you're a piece of code.

Normal writing does not have the details at the beginning, that's true. But they don't have the conclusion and flow at the beginning! The introduction in writing can be compared to loading modules, using strict. Then, explanation comes, so you can understand the rest of the text. When that's done, body and conclusion follow.

Subs, in my opinion, are not footnotes, they form information _required_ to understand the rest of the code. That's another good reason for putting small subs that just encode data, and don't have to do much with program flow in separate modules (footnotes...).

A Perl program is executed in order. Unless you want it otherwise, it will end after having evaluated the last statement, which should be logically the end of the file. And it's a reason to put your subs at the top too! For the same reason you put use statements at the beginning: they are required pieces of knowledge to be able to fully comprehend the rest of the code.

44696420796F7520732F2F2F65206F
7220756E7061636B3F202F6D736720
6D6521203A29202D2D204A75657264

Replies are listed 'Best First'.
Re (4): where do you put your subs
by mpeppler (Vicar) on Mar 08, 2002 at 20:59 UTC
    The parens/ampersand are not much of a problem...
    I just wanted to point out that there is a side effect to not using parens on a subroutine/method call: the called subroutine "inherits" the @_ array of the caller. While most of you are probably aware of this it is something that can have some unintended consequences - hence my preference for always using the parens on subroutine calls.

    Michael

      I just wanted to point out that there is a side effect to not using parens on a subroutine/method call: the called subroutine "inherits" the @_ array of the caller.

      Not entirely true. While &foo passes @_, foo and foo() and &foo() do not. Hence, imho for not passing @_ the best solution is to avoid the ampersand where possible (which means you pretty much only use it to create references).

      Proof:

      sub test { print "\@_: @_\n"; } @_ = qw(a b c); print 'test; # '; test; print '&test; # '; &test; print 'test(); # '; test(); print '&test(); # '; &test(); __END__ test; # @_: &test; # @_: a b c test(); # @_: &test(); # @_:

      44696420796F7520732F2F2F65206F
      7220756E7061636B3F202F6D736720
      6D6521203A29202D2D204A75657264
      

        My perl {3,4} training is showing, obviously... :-)

        Thanks for the correction.

        Michael