[英]How can I validate enum types as Perl subroutine arguments?
建立關閉Perl是否具有枚舉類型? ,如何執行動態類型檢查(或靜態類型檢查,如果use strict能夠這樣做)我的子例程參數是否獲得正確的枚舉類型?
package Phone::Type;
use constant {
HOME => 'Home',
WORK => 'Work',
};
package main;
sub fun
{
my ($my_phone_type_enum) = @_;
# How to check my_phone_type_enum, is either Phone::Type->HOME or Phone::Type->WORK or ... but not 'Dog' or 'Cat'?
}
fun(Phone::Type->HOME); # valid
fun(Phone::Type->WORK); # valid
fun('DOG'); # run-time or compile time error
這是一種方式:
#!/usr/bin/perl
package Phone::Type;
use strict;
use warnings;
use constant {
HOME => 'Home',
WORK => 'Work',
};
package main;
use strict;
use warnings;
sub fun {
my ($phone_type) = @_;
Phone::Type->can( $phone_type )
or die "'$phone_type' is not valid\n";
}
fun('HOME'); # valid
fun('WORK'); # valid
fun('DOG'); # run-time or compile time error
__END__
C:\Temp> dfg
'DOG' is not valid
我建議您使用Readonly(如引用的問題中所建議的)而不是常量。 我建議采用兩種可能的方法(取決於你使用的是Perl 5.10還是5.8)。
最初,相同的代碼:
use strict;
use warnings;
use Readonly;
Readonly my @phone_types = qw/HOME WORK/;
Perl 5.10:
sub fun
{
my $type = shift;
die "Invalid phone type: $type" unless $type ~~ @phone_types;
# ...
}
Perl 5.8:
sub fun
{
my $type = shift;
die "Invalid phone type: $type" unless grep { $_ eq $type} @phone_types;
# ...
}
CPAN上有一個模塊可以讓你對參數類型和值有很大的控制權,但我不能記住它。 也許其他人可以。
package Phone::Type;
my $types;
BEGIN {
$types = {
HOME => 'Home',
WORK => 'Work',
};
}
use constant $types;
sub is_phone_type {
my ($type) = @_;
return exists $types->{$type};
}
package main;
use Carp ();
sub fun
{
my ($my_phone_type_enum) = @_;
Phone::Type::is_phone_type( $my_phone_type_enum)
or Carp::croak "Invalid type $my_phone_type_enum";
}
fun(Phone::Type->HOME); # valid
fun(Phone::Type->WORK); # valid
fun('DOG'); # run-time or compile time error
(BEGIN是在編譯時設置$ types所必需的,因此它可用於use語句。)
在Perl中,對這樣的事情放松是很常見的; 假設函數是傳遞數字,你期望數字,等等。但如果你想做這種驗證,你可能會對Params :: Validate感興趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.