Search code examples
functionperlargumentssubroutine

How to check if a function parameter is a string or array in Perl


I'm trying to write a custom validateParameter function with Perl. I have the following code which also works:

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 ) {
    #}
}

I want to call my function the following way:

validateParameter({ hallo => "Welt", test => "Blup"},  ["hallo", "test"]);

But I also want to call my function like this:

validateParameter({ hallo => "Welt", test => "Blup"},  "hallo");

I know that Perl only has the following three data-types (scalars, hashes, arrays). But maybe there is a smart way to check if a variable is a string.

How can I check if the given arg is a string?


Solution

  • No, there is no way to check if a scalar is a string, as Perl does implicit type conversions depending on context. If you give a number as the second argument to your function, and you use it in a context that requires a string, it will be automatically converted to a string. So, just check if ref($list) is empty - in such case, $list is not a reference, and therefore it is a string or a number, and you don't need to distinguish between those two.