什麼是在perl中進行防禦性編程的最佳(或推薦)方法? 例如,如果我有必須調用一個(定義)SCALAR,一個ARRAYREF和一個可選的HASHREF的子。perl防禦性編程(die,assert,croak)
我見過的方法三:
sub test1 {
die if !(@_ == 2 || @_ == 3);
my ($scalar, $arrayref, $hashref) = @_;
die if !defined($scalar) || ref($scalar);
die if ref($arrayref) ne 'ARRAY';
die if defined($hashref) && ref($hashref) ne 'HASH';
#do s.th with scalar, arrayref and hashref
}
sub test2 {
Carp::assert(@_ == 2 || @_ == 3) if DEBUG;
my ($scalar, $arrayref, $hashref) = @_;
if(DEBUG) {
Carp::assert defined($scalar) && !ref($scalar);
Carp::assert ref($arrayref) eq 'ARRAY';
Carp::assert !defined($hashref) || ref($hashref) eq 'HASH';
}
#do s.th with scalar, arrayref and hashref
}
sub test3 {
my ($scalar, $arrayref, $hashref) = @_;
(@_ == 2 || @_ == 3 && defined($scalar) && !ref($scalar) && ref($arrayref) eq 'ARRAY' && (!defined($hashref) || ref($hashref) eq 'HASH'))
or Carp::croak 'usage: test3(SCALAR, ARRAYREF, [HASHREF])';
#do s.th with scalar, arrayref and hashref
}
有不僅僅是一種方式去做。所有的方法都有其優點和缺點。一些方法比其他方法更習慣/可讀/簡潔/可維護。我認爲以下是對這個問題更合適的標題:檢查子程序參數最常用的方法是什麼? – Zaid
您是否考慮過CPAN產品? ['Params :: Validate'](https://metacpan.org/pod/Params::Validate)和['Type :: Params'](https://metacpan.org/pod/Type::Params)look像很好的候選人。 – Zaid