Perl Best Practices [Electronic resources] نسخه متنی

اینجــــا یک کتابخانه دیجیتالی است

با بیش از 100000 منبع الکترونیکی رایگان به زبان فارسی ، عربی و انگلیسی

Perl Best Practices [Electronic resources] - نسخه متنی

Damian Conway

| نمايش فراداده ، افزودن یک نقد و بررسی
افزودن به کتابخانه شخصی
ارسال به دوستان
جستجو در متن کتاب
بیشتر
تنظیمات قلم

فونت

اندازه قلم

+ - پیش فرض

حالت نمایش

روز نیمروز شب
جستجو در لغت نامه
بیشتر
لیست موضوعات
توضیحات
افزودن یادداشت جدید


9.5. Missing Arguments


Use definedness or existence to test for missing arguments .


It's a common mistake to use a boolean test to probe for missing arguments:


Readonly my $FILLED_USAGE => 'Usage: filled($text, $cols, $filler)';
sub filled {
my ($text, $cols, $filler) = @_;
croak $FILLED_USAGE
if !$text || !$cols || !$filler;
# [etc.]
}

The problem is that this approach can fail in subtle ways. If, for example, the filler character is '0' or the text to be padded is an empty string, then an exception will incorrectly be thrown.

A much more robust approach is to test for definedness:


use List::MoreUtils qw( any );
sub filled {
my ($text, $cols, $filler) = @_;
croak $FILLED_USAGE
if any {!defined $_} $text, $cols, $filler;

# [etc.]

}

Or, if a particular number of arguments is required, and undef is an acceptable value for one of them, test for mere existence:


sub filled {
croak $FILLED_USAGE if @_ != 3;

# All three args must be supplied

my ($text, $cols, $filler) = @_;
# etc.

}

Existence tests are particularly efficient because they can be applied before the argument list is even unpacked. Testing for the existence of arguments also promotes more robust coding, in that it prevents callers from carelessly omitting a required argument, and from accidentally providing any extras.

Note that existence tests can also be used when some arguments are optional, because the recommended practice for this casepassing options in a hashensures that the actual number of arguments passed is fixed (or fixed-minus-one, if the options hash happens to be omitted entirely):


sub filled {
croak $FILLED_USAGE if @_ < 1 || @_ > 2;
my ($text, $opt_ref) = @_;

# Cols and fill char now passed as options
# etc.

}

/ 317