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