in reply to Re^3: Automatically add all defined functions to your @EXPORT
in thread Automatically add all defined functions to your @EXPORT

I prefer putting one very specific item per map or grep.

I don't get the logic of this. (That doesn't mean you should change it, I'd just like to understand it).

You (probably) wouldn't code:

if( $var == 1 ) { doSomething(); } if( $var == 1 ) { doSomethingElse(); }

Instead of

if( $var == 1 ) { doSomething(); doSomethingElse(); }

Or

if( $var1 == 1 ) { if( $var2 == 2 ) { doSomething(); } }

In preference to

if( $var1 == 1 && $var2 == 2 ) { doSomething(); }

(would you?).

So why the difference about combining the conditional in grep?


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
The "good enough" maybe good enough for the now, and perfection maybe unobtainable, but that should not preclude us from striving for perfection, when time, circumstance or desire allow.

Replies are listed 'Best First'.
Re^5: Automatically add all defined functions to your @EXPORT
by Tanktalus (Canon) on Jun 21, 2005 at 16:24 UTC
    if( $var1 == 1 ) { if( $var2 == 2 ) { doSomething(); } }
    In preference to
    if( $var1 == 1 && $var2 == 2 ) { doSomething(); }
    (would you?).

    Actually, I quite often find that the first of these two is exactly what I want as it makes what I'm doing much more clear. Othertimes, I use the latter. It really depends on whether the two tests are related or not, as well as whether there are other things I want to do in the $var==1 case but only if $var2!=2.

    So I often find myself writing a grep of a grep. Or a grep of a map of a map of a grep. Or a map of a grep of a grep. Or ... when a single map may just do fine.

    Your first example, having two if's to check the same thing, isn't really analogous to combining grep's since each grep is checking different things.

      Actually, I quite often find that the first of these two is exactly what I want as it makes what I'm doing much more clear. Othertimes, I use the latter.

      Horses for courses I guess, but I think that in most every case I can recall, I find that <code> if( $var == 1 and $var == 2 )} doSomething(); } <code>

      is as clear if not clearer than nested ifs as it clearly demonstrates that doSomething is dependant upon both condition; removes the potential for inadvertant mis-inclusions; and clarifes through the reduced clutter of unnecessary punction and syntax.

      as well as whether there are other things I want to do in the $var==1 case but only if $var2!=2.

      That is a different case, and a) requires the separation of the tests; b) is clarified by that separation.

      In the cited case, the artificial separation leads (me) to questions about what was really in the mind of the author when the constructed the code. Questions that serve to confuse rather than clarify; doubt rather than know.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      The "good enough" maybe good enough for the now, and perfection maybe unobtainable, but that should not preclude us from striving for perfection, when time, circumstance or desire allow.
      I err on the side of caution (wrt '&&' vs. 'and ) and use
      if ( $var1 == 1 and $var2 == 2 ) { doSomething(); }


      of course, with if's, it all depends on the logic branching outside of that particular if statement. It's not a "set in stone" decision.
Re^5: Automatically add all defined functions to your @EXPORT
by dragonchild (Archbishop) on Jun 21, 2005 at 15:06 UTC
    Because it's apples and oranges. doSomething() and doSomethingElse() aren't related via a pipeline, which the conditionals in grep are. So, by placing unrelated conditionals in their own greps, I give myself the opportunity to throw a map in there, if I feel like it. Putting them in the same grep removes that possibility.

    My criteria for good software:
    1. Does it work?
    2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?
Re^5: Automatically add all defined functions to your @EXPORT
by ikegami (Patriarch) on Jul 14, 2005 at 20:48 UTC
    I don't get the logic of this.

    As an occasional user of multiple greps, I find

    @var = something1 grep { something2 && something3 } map { something4 } keys %something5;

    less readable than

    @var = something1 grep { something2 && something3 } map { something4 } keys %something5;

    But sometimes, something2 && something3 is too long, so I break them down into:

    @var = something1 grep { something2 } grep { something3 } map { something4 } keys %something5;

    And yes, I sometimes do

    if( $var1 == 1 ) { if( $var2 == 2 ) { doSomething(); } }

    in preference to

    if( $var1 == 1 && $var2 == 2 ) { doSomething(); }

    when the condition becomes quite long.

      I agree that
      @var = something1 grep { something2 && something3 } map { something4 } keys %something5;
      isn't all that readable, but you can do
      @var = something1 grep { something2 && something3 } map { something4 } keys %something5;