http://www.perlmonks.org?node_id=177401


in reply to Some suggestions on coding style - a chance to critique

First off, this looks a lot like something from Mr. Wright. Bag it. Use Mime::Lite or something like that for the mailing. But kudos for using pass-by-ref. I see lots of pass-by-val, and that drives me nuts. A couple of other things, but maybe just preference:

  • If you're printing to STDOUT in various places, set $|=1; Otherwise, push everything onto an array, and just dump the whole array when you're done.
  • I don't use the C-style of bracketing. Too hard for me to read. Rather:
    sub function { # code in here }

    This keeps the brackets lined up vertically, and helps me keep track of deeply nested loops. Of course, this is certainly preference, and doesn't really have much to do wrt the code.

  • Dump the "&" in front of subroutine calls.
  • Likewise, dump the quotes in hashkeys, unless you got whitespace in there. Of course, if you have whitespace in your hashkeys, camelBack them or use _ or something. I'm all for saving keystrokes!
  • If you're using a hash, then use the hash:
    @$required = split /,/, $$formdata{'required'} unless ($$formdata{ +'required'} eq ""); $$redirect = $$formdata{'redirect'} unless ($$formdata{'required'} + eq ""); . . .

    I hate stuff like this. Assigning variables to hash values, IMHO, should only be done if you have some really complex data structures, and even then, I believe you should use some sort of interpolation, lest you continue to de-ref every time you access something.

  • Again, maybe just style: Unless it's a small hack, a never define vars outside of subroutines. You forget a my, and all hell could break loose. For more on what I'm getting at, look here
  • If/then is your friend:
    $method = "<font face=verdana size=1>An error with the script's in +stallation has occured. Please contact the webmaster with the error messages listed be +low!" if $method == 0; $method = "<font face=verdana size=1>An error occured with your su +bmission. Please check the errors and make any necessary modficiations!</font>" + if $method == 1;

    Use standard if-then/ternary syntax here. Make perl figure out which case you're on before assigning the $method values. AFAIK, in your code, it assigns the value, then will pitch it if the conditional isn't met. Don't waste the cycles.

  • HTH, and again, much of this may be just preference.
    ÅßÅ×ÅßÅ
    "It is a very mixed blessing to be brought back from the dead." -- Kurt Vonnegut

    Replies are listed 'Best First'.
    Re: Re: Some suggestions on coding style - a chance to critique
    by chromatic (Archbishop) on Jun 26, 2002 at 20:03 UTC
      # If you're printing to STDOUT in various places, set $|=1;

      Why would you want to slow things down to get output in smaller chunks more often? Buffering is enabled for a reason, and I'm curious as to why you recommend disabling it.

    Re: Re: Some suggestions on coding style - a chance to critique
    by emilford (Friar) on Jun 26, 2002 at 15:35 UTC
      Dump the "&" in front of subroutine calls.

      What is the reason for this? Does this make some sort of difference?

      If you're using a hash, then use the hash:
      @$required = split /,/, $$formdata{'required'} unless ($$formdata{ +'required'} eq ""); $$redirect = $$formdata{'redirect'} unless ($$formdata{'required'} + eq ""); . . .
      I hate stuff like this. Assigning variables to hash values, IMHO, should only be done if you have some really complex data structures, and even then, I believe you should use some sort of interpolation, lest you continue to de-ref every time you access something


      I'm not positive what you're refering to here. Is it just that I should use the hash in my code as opposed to assigning the hash values to a variable and then using the variable instead?

      If you're printing to STDOUT in various places, set $|=1; Otherwise, push everything onto an array, and just dump the whole array when you're done

      What exactly does the $|=1 do?

      Thanks for the suggestions.
        Dump the "&" in front of subroutine calls.
        1. Using & disables a function's prototype.
        2. If you don't pass any parameters to a function, but call it using &, it will receive your current @_ as its parameters. This can lead to very hard to spot errors.
        Is it just that I should use the hash in my code as opposed to assigning the hash values to a variable and then using the variable instead?
        Indeed. Why assign to a hash first when you're going to put it into a variable afterwards? Using a hash also is usually cleaner, since it provides an own little name space for the variables in question; it keeps together what belongs together, and keeps them from littering the global namespace.
        What exactly does the $|=1 do?
        It disables buffering for the currently selected filehandle (which would usually be STDOUT). See perlvar.

        Makeshifts last the longest.

          For a more elaborate discussion of & vs. non-& sub calls, check the replies that followed from one of my early posts, A question of style. Notably, tye's excellent post here.
          "One word of warning: if you meet a bunch of Perl programmers on the bus or something, don't look them in the eye. They've been known to try to convert the young into Perl monks." - Frank Willison