my $bar = expensive();
$foo = $bar if defined $bar;
if (defined(my $bar = expensive())) {
$foo = $bar;
}
$foo = $_ for grep defined, expensive();
sub assign_ifdef { $_[0] = $_[1] if defined($_[1]) }
assign_ifdef($foo, expensive());
The preceeding solution is very similar to what you asked (=ifdef) and very simple (single op).
Bonus points if $foo can also be a list.
I'm not sure if you mean
my $bar = expensive();
($i1, $i2) = $bar if defined $bar;
or
if (defined(my $bar = expensive()) {
$_ = $bar for $i1, $i2;
}
Update: Added second and third.