in reply to In What basis the subroutine return values assign to variables ?

The or-trick can't be used with multiple (list-) assignments. The code
my ($price, $floor) = get_price_floor() || 0; sub get_price_floor { return (10, 8); }
is parsed as
my ($price, $floor) = (get_price_floor() || 0);
which means that get_price_floor() is called in scalar context. Consequently, the return statement happens in scalar context which means that (10, 8) evaluates to 8 (the scalar comma operator). That is assigned to $price while $floor comes out undefined.

Since you have defined get_price_floor() yourself, it isn't quite clear why you want to prepare for the case it doesn't return anything -- you *know* what it returns. If you have to do that, one way would be the not particularly attractive

my ($price, $floor); (($price, $floor) = get_price_floor()) || (($price, $floor) = ( 0, 0));
Also note I have removed the ampersand from the calls to get_price_floor(). It isn't necessary and, in fact, has side effects you normally don't want.

Anno