use Carp qw/cluck/; sub myprintf { cluck "myprintf: undef argument(s)" if grep {!defined} @_; printf @_ } myprintf "%s-%s-%s-%s\n", 'quz', undef, 'baz', undef; __END__ myprintf: undef argument(s) at - line 4. main::myprintf("%s-%s-%s-%s\x{a}", "quz", undef, "baz", undef) called at - line 7 Use of uninitialized value in printf at - line 5. Use of uninitialized value in printf at - line 5. quz--baz-