Perl:命名参数验证最佳实践

3
我正在使用类方法调用中的命名参数,并想知道是否有最佳实践来确保不传递未知参数。以下是我的做法:
sub classmethod {
    my $self = shift;
    my %args = (
        "param1" => "default1",
        "param2" => "default2",
        @_
    )

    if (my @invalid = grep { !/^(param1|param2)$/ } keys %args) {
        croak "received unknown arg(s) ".join(",", @invalid)." from ".caller();
    }
}

这是一种正确的前进方式吗?还是会导致性能问题?

最好, 马库斯

2个回答

5
你可以使用 Params::Validate。另一个选择是Params::Check
如果参数是固定的,则最好在开发期间验证它们,并在实际运行时关闭验证选项。

1
我已经投票支持这个回答,因为这两个模块似乎都很有用来验证参数。虽然使用另一个模块来检查不需要的术语似乎有点过度,但我不会将其作为接受的答案。无论如何,感谢你的努力! - Marcus

1
有很多种方法可以在Perl中传递参数,也有很多种方法可以验证它们(或不验证)。
如果您仍然使用显式默认成语,并希望轻松处理,则可以检查哈希中的键数是否等于默认值中的键数。获取键数是一项快速操作,不依赖于哈希表的大小或内容。如果@_中存在一个不在%default中的键,则%args将具有更多的键。
与您当前的解决方案相比,这种方法的缺点是它不会告诉您哪个键是意外的。
sub classmethod {
    my $self = shift;
    my %args = (
        param1 => "default1",
        param2 => "default2",
        @_
    );
    keys %args == 2 or croak "received unknown arg. args: " . join(", ", keys %args);
}

或者这样做,以避免在更改参数数量时必须更改数字。

sub classmethod {
    my $self = shift;
    my %default = (
        param1 => "default1",
        param2 => "default2",
    );
    my %args = (%default, @_);

    keys %args == keys %default or croak 'unknown arg' . join(", ", keys %args);
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接