in reply to undef vs 0

That's why perl6 will have the '//' operator. Heck, it could even be that one of the future perl5 versions will have it... Urm... no, perl5.8.0 doesn't have it, yet. You can search through the P5P archives to see any discussions, for example in this message.

Anyway, a contrived solution could be:

my($value) = map { defined() ? $_ : 1 } getConfigValue( "use_foo" );
Perhaps a less vicious example:
my $value = do { defined(local $_ = getConfigValue( "use_foo" )) ? $_ +: 1 };
You could always write a sub I suppose — perhaps in an external module, if you use it a lot?
sub default { my $v = shift; return defined $v ? $v : shift; } my $value = default(getConfigValue( "use_foo" ), 1);