Perl 中如何检查函数参数是字符串还是数组

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 是否是字符串?

yst*_*sth 5

更新:我不知何故错过了问题的结尾。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可以做什么。