Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Re: Values passed into a sub routine

by wallisds (Beadle)
on Apr 19, 2011 at 15:59 UTC ( #900158=note: print w/replies, xml ) Need Help??

in reply to Values passed into a sub routine

In my opinion the answer to your question is 'yes'. At least that's what I'd do. I'd probably just pass 0 through... In the sub I would then check for the value before proceeding.

From program A:
build_url( $account ,$transaction, $location, $fname, $lname);
From program B:
build_url( $account, 0, 0, $fname, $lname);
From program C:
build_url( $account, $transaction, 0, $fname, $lname);
From program D:
build_url( $account ,$transaction, $location, $fname, $lname);

sub build_url { my ($account ,$transaction, $location, $fname, $lname) = @_; if ($location) { ... do what you would do ... }#example }

Replies are listed 'Best First'.
Re^2: Values passed into a sub routine
by Argel (Prior) on Apr 19, 2011 at 21:50 UTC
    What if '0' is valid for one of the entries?!? Better to use 'undef' instead. And even better would be to just pass a hash reference in (or use named parameters).

    Elda Taluta; Sarks Sark; Ark Arks

      Thanks Argel!

      I appreciate what you have posted and I see your point. I think using undef makes sense when used also with 'defined', but here's my reasoning behind my original suggestion...

      The question was:
      "Should I make sure that I always pass 5 expected values to this sub routine even if I have to pass blank values, but preserving the order that the code is expecting them?"

      The answer is yes to that question if the person asking is going to continue to use a list array method. I think Undef is only safer than 0 if you use 'defined' to check it, otherwise it's the same as 0, '', '0', right? At least that's what I got out of this perldoc:

      Also, I thought 0 would be alright in this scenario based on what I interpreted the expected values to contain, but then again, it would be a mistake to assume data would be entered in any expected format, especially if it is coming in from a form.

      If we don't use a hash this is a better solution:
      build_url( $account, $transaction, undef, $fname, $lname);
      sub build_url() { ... etc... if (defined($location)) { ... stuff ... } }

        No, 0 and undef are not always the same. Take 'fork' as an example:
        Does a fork(2) system call to create a new process running the same program at the same point. It returns the child pid to the parent process, 0 to the child process, or undef if the fork is unsuccessful.
        So 0 indicates it is a child process while undef indicates failure. Not the same.

        In general, you should be checking for definedness if your data is coming from outside of the script anyway. I usually do something like 'if( defined $foo && $foo ne ""){}' That way I avoid warnings about doing a string comparison with an undefined value (or whatever the warning message says). You are using 'strict' and 'warnings', right?

        Anyway, your code above looks good.

        Elda Taluta; Sarks Sark; Ark Arks

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (2)
As of 2023-02-04 03:09 GMT
Find Nodes?
    Voting Booth?
    I prefer not to run the latest version of Perl because:

    Results (30 votes). Check out past polls.