Ed Avis schreef:
> Perl's list assignment feature is very useful.
>
>     sub returns_three_things { return (1, 2, 3) }
>     my ($x, $y, $z) = returns_three_things();
>
> Often, though, you want to add some error checking.  Particularly
> when providing an interface that others can call.
>
>     # Parameters: first name, last name, birthday.
>     sub print_person_details {
>        croak 'pass three arguments' if @_ != 3;
>        my ($first_name, $last_name, $birthday) = @_;
>        say "$first_name $last_name was born on $birthday";
>     }
>
> The extra 'croak' test gives a more friendly error message than 'use
> of uninitialized value in ...', which would require the user of the
> subroutine to go digging in its code to find what he passed wrongly.
>
> Even in code that's not part of a public interface, you may want to
> check that the list has the right size before you do the assignment,
> just to catch programmer mistakes early rather than waiting for an
> uninitialized value warning later on.
>
> But it's rather a pain to keep checking the list size each time.
> When you 'unpack a tuple' in Python the size is checked and an
> exception is thrown if it's too big or too small.  Is there an
> equivalent in Perl?  Something like
>
>      safe_assign ($a, $b, $c) = @array;    # will die if
> scalar(@array) != 3

Even if the number of parameters is right, the values of the parameters
might be wrong. So you beter check each value.

perl -we'
    sub say { return print $_[0], qq{\n} }

    sub print_person_details {
        defined or return for @_[0..2];
        return say qq{$_[0] $_[1] was born on $_[2].};
    }

    print_person_details qw{John Johnson Friday afternoon}
      or say q{error};
    print_person_details qw{Eve Evening}
      or say q{error};
'
John Johnson was born on Friday.
error

-- 
Affijn, Ruud

"Gewoon is een tijger."

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to