如果一个子程序被调用的参数比预期的多?

时间:2013-02-12 16:02:20

标签: perl error-handling arguments subroutine

如果一个子程序在使用比预期更多的参数调用时是否应该克服,或者是否应该忽略额外的参数?

#!/usr/bin/env perl
use warnings;
use strict;


sub routine {
    my ( $a, $b ) = @_;
    return $a * $b;
}

my $reslult = routine( 4, 5, 6 );

2 个答案:

答案 0 :(得分:7)

一般来说,我不打算手工编写参数检查,但我认为正确的反应是呱呱叫。这样,您可以扩展函数以便稍后获取可选参数,而不会破坏现有的调用者。

如果你的Perl足够新,你可以像这样安装和使用Function::Parameters

use warnings;
use strict;
use Function::Parameters qw(:strict);

fun routine($x, y) {
    return $x * $y;
}

my $result = routine(4, 5, 6);  # croaks automatically

(顺便说一句,不要调用您的变量$a$b:这些名称由sort使用,并免于strict 'vars'次检查。)

答案 1 :(得分:7)

即使在一个项目中,这也有点主观。在某些情况下,多余的参数可能表明调用者存在真正的问题,值得检查,特别是如果子例程是已发布库的一部分。另一方面,如果子例程是用于内部消耗的,则忽略额外的参数可以使其更方便。 (例如,您希望它对数组中的第一个元素进行操作,但不要打扰隔离该值并将其赋予整个数组。)

考虑用例,以及这些额外的参数是否只是垃圾或可能暗示真正的问题,以及性能问题是什么应该有助于您确定它是否值得。另一个考虑因素:子程序中的代码会自然地捕获可能导致出现额外参数的错误。如果是这样,测试参数计数可能是多余的,并且可能不如以后捕获的特定错误有用。