my $my_var = "default" unless defined $param; $my_var //= $param; #### #!/usr/bin/env perl use strict; use warnings; use feature 'say'; use feature 'signatures'; no warnings 'experimental::signatures'; use Data::Dump qw( pp ); sub foo( $param ) { say "\$param is ", pp( $param ); my $my_var = "default" unless defined $param; say "\$my_var after declaration is ", pp( $my_var ); say +( defined $param ? ! defined $my_var : defined $my_var && $my_var eq 'default' ) ? " (as expected)" : " (unexpected to me!)"; $my_var //= $param; say "\$my_var after '//=' is ", pp( $my_var ); say ""; return $my_var; } foo( $_ ) for undef, "call 1", "call 2", "call 3"; 1; #### $ ./my_with_if.pl $param is undef $my_var after declaration is "default" (as expected) $my_var after '//=' is "default" $param is "call 1" $my_var after declaration is undef (as expected) $my_var after '//=' is "call 1" $param is "call 2" $my_var after declaration is "call 1" (unexpected to me!) $my_var after '//=' is "call 1" $param is "call 3" $my_var after declaration is "call 1" (unexpected to me!) $my_var after '//=' is "call 1"