use IO::Handle; my $filename = "/etc/passwd"; open my $fh, '<', $filename or die $!; my $customerr = sub { my $msg = shift; $msg =~ s/\.?\s*$//; return "$msg ($filename line ".$fh->input_line_number.")\n"; }; local $SIG{__WARN__} = sub { warn $customerr->(shift) }; local $SIG{__DIE__} = sub { die $customerr->(shift) }; while (<$fh>) { warn "BEEP!" if /root/; die "ACK!" if /nobody/; } close $fh; __END__ BEEP! at - line 12, <$fh> line 1 (/etc/passwd line 1) ACK! at - line 13, <$fh> line 7 (/etc/passwd line 7)