use warnings; use strict; use Data::Dumper; open my $log_fh, '>', 'log.txt' or die $!; my @HR = (1, 2, undef, 3); my $thing = undef; my $blah = 99; { local $SIG{__WARN__} = sub { if ($_[0] =~ /uninitialized/){ my $warn = { '@HR' => \@HR, '$thing' => $thing, '$blah' => $blah, }; print $log_fh Dumper $warn; print $log_fh "\n"; } }; my $x = sprintf $thing, @HR; }