Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"

Re: Format Style Opinions: my, ternary, subroutine

by webfiend (Vicar)
on Dec 04, 2007 at 18:11 UTC ( #654895=note: print w/replies, xml ) Need Help??

in reply to Format / Logical Expression / Style Opinions: my, ternary, subroutine, @_

I no longer fear the ternary operator, so this is readable enough. There must be a clearer way to express the logic, though. Having the first parameter be undefined when @_ isn't quite long enough, and croaking if @_ isn't exactly the right length ... it makes my brain hurt a little.

What about switching around the order of the parameters?

sub xyz { my ($xxx, $yyy, $ttt) = @_; # You could also say -> if( !$xxx || !$yyy ) # if you wanted to avoid 'unless' like the PBB says unless ($xxx && $yyy) { croak('Not good.'); } # ... }

This way we don't have to enforce a specific size for @_, too. Double bonus.

Replies are listed 'Best First'.
Re^2: Format Style Opinions: my, ternary, subroutine
by jffry (Hermit) on Dec 04, 2007 at 18:28 UTC

    Wow. That is a simpler way to express it. Thanks. I think I'm still in that "everything is a nail" phase with the ternary op.

    However, I don't think it is wise to quietly keep going if a 4th argument is passed to it. I don't know about anyone else who might use this sub, but I certainly want to tell myself if I'm using it wrong.

      I understand your nervousness about extra arguments, but I've learned that they don't really matter in Perl. An analogy that comes to mind is filling a glass of water. If I hand you a cup and you pour a gallon of water into it, all I get back is a cup. I might make fun of you for being so sloppy, but who cares? After all, I have the cup of water that I wanted.

      Still, if it is important to you, you can enforce it with logic in your sub.

      sub xyz { my $xxx = shift || croak('Missing xxx parameter'); my $yyy = shift || croak('Missing yyy parameter'); my $ttt = shift; # Enforce length of function parameter list. if (@_) { croak('Too many args for xyz!'); } # ... }

      ... but things like that risk making the code a little harder to read.

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (4)
As of 2019-07-21 12:48 GMT
Find Nodes?
    Voting Booth?
    If you were the first to set foot on the Moon, what would be your epigram?

    Results (8 votes). Check out past polls.