Fra*_*345 4 perl arguments function subroutine
我正在尝试用 Perl 编写自定义validateParameter函数。我有以下代码也可以工作:
sub validateParameter {
my ($args, $list) = @_;
if ( ref($list) eq "ARRAY" ) {
foreach my $key (@$list) {
if ( not defined $args->{$key} ) {
die "no $key given!";
}
}
}
#elsif ( check if string ) {
#}
}
Run Code Online (Sandbox Code Playgroud)
我想通过以下方式调用我的函数:
validateParameter({ hallo => "Welt", test => "Blup"}, ["hallo", "test"]);
Run Code Online (Sandbox Code Playgroud)
但我也想这样调用我的函数:
validateParameter({ hallo => "Welt", test => "Blup"}, "hallo");
Run Code Online (Sandbox Code Playgroud)
我知道 Perl 只有以下三种数据类型(标量、散列、数组)。但也许有一种聪明的方法来检查变量是否是字符串。
如何检查给定的 arg 是否是字符串?
更新:我不知何故错过了问题的结尾。ref($list) eq 'ARRAY'大多数情况下,仅测试即可工作,但为了正确允许重载对象,您应该尝试取消引用参数:
if ( eval { \@$list } ) {
# it was an array
}
else {
# assume it is a string
}
Run Code Online (Sandbox Code Playgroud)
原答案:
您可以检查有关参数的许多信息:
if ( ! defined $param ) {
# undefined
}
elsif ( defined Scalar::Util::blessed($param) ) {
# object
}
elsif ( ref $param ) {
# reference (return of ref will give the type)
}
elsif ( length do { no warnings "numeric"; $param & '' } ) {
# number
}
else {
# string
}
Run Code Online (Sandbox Code Playgroud)
但是所有这些(可能除了定义的检查)都违背了 Perl 自动转换为所需类型的目的,并且会限制可以传递的内容(例如,需要数字的字符串或双变量,或者需要重载的对象)需要一个字符串、数字或引用,或者绑定变量或魔术变量,例如$!)。
您可能还想看看Params::Validate可以做什么。