Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

perl function ignores undef arguments

Tags:

perl

I'm passing some arguments to a function, one of which might be undefined.

$a = ($config->function(param('a'),'int'));

my module contains a function which looks like this:

sub function{                    
        my $self = $_[0];           
        my $t = $_[1];              
        my $type = $_[2];           
        print "$self,$t,$type<br/>";
}

I've tried with shift instead of the @_ syntax, but there's no change. The problem is that if $config->function is called with an undefined param('a') it prints like this:

MY_FUNC=HASH(0x206e9e0),name, it seems that $t is being set to the value of what $type should be and the undef is being ignored completely.

like image 309
EricR Avatar asked Sep 05 '26 13:09

EricR


1 Answers

undef is perfectly valid in a parameter list. I suspect that the problem here is that the param function is returning an empty list, rather than undef.

sub function {
    no warnings 'uninitialized';
    print join "/", @_;
}

function(undef,"foo");      #   outputs "/foo"
function((), "foo");        #   outputs "foo"

In the argument list to function, the param function is evaluated in list context.

sub param1 {
    return;     # undef in scalar context, but empty list in list context
}

sub param2 {
    return undef;    # scalar ctx: undef, list ctx: list with one undef elem
}

function(param1(), "foo");    #   param1() -> () ... outputs "foo"
function(param2(), "foo");    #   param2() -> (undef) ... outputs "/foo"

A workaround is to make sure that your param function is evaluated in scalar context.

function(scalar param1(), "foo");    # now outputs "/foo"

Note that actually saying return undef in your Perl subroutines is considered by some to be a code smell.

like image 54
mob Avatar answered Sep 08 '26 19:09

mob



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!