in reply to Complaints from Warnings about uninitialized var

If you do not want to modify the value of $middle (so you leave it as undef, and not an empty string), you may want to use printf:

printf "last:(%s) first(%s) middle(%s)\n", $last || '', $first || '', $middle || '';

or if you've got a whole lot to deal with

printf "some format string goes here", map { defined($_) ? $_ : '' } (@list_of_variables);

Or, there's always:

{ no warnings 'uninitialized'; print "whatever"; }