ikegami has asked for the wisdom of the Perl Monks concerning the following question:

You've probably noticed how the following displays the number of lines read in from last read file handle is displayed along the program line number in a die.

while (<DATA>) { die "Error!" if $_ eq ".\n"; } __DATA__ a b c . d e
Error! at script.pl line 2, <DATA> line 4.

Further study shows this is not a property of the while.

<DATA>; die "Error!"; __DATA__ a b
Error! at script.pl line 2, <DATA> line 1.

The data line number appears as long as the file handle is still open.

<DATA>; close(DATA); die "Error!"; __DATA__ a b
Error! at script.pl line 3.

You can even play with the number!

<DATA>; $. = 100; die "Error!"; __DATA__ a b
Error! at script.pl line 3, <DATA> line 100.

Setting $. to 0 hides the message.

<DATA>; $. = 0; die "Error!"; __DATA__ a b
Error! at script.pl line 3.

Is it also possible to play with the filehandle name? For example, could perl be tricked (suing XS, surely) into displaying

Error! at script.pl line 3, filename.dat line 100.

Replies are listed 'Best First'.
Re: Playing with "<FH> line 123" die messages
by Anonymous Monk on Aug 15, 2006 at 09:37 UTC
    <DATA>; #line 666 DEVIL DEVIL die "You're the ";

      For those confused by this, see perlsyn, last section: "Plain Old Comments (Not!)".

      -xdg

      Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Re: Playing with "<FH> line 123" die messages
by syphilis (Archbishop) on Aug 15, 2006 at 10:43 UTC
    use subs 'die'; my $filename = 'filename.dat'; while (<DATA>) { $. = 100; die "Error!" if $_ eq ".\n"; } sub die { my @caller = caller(); print $_[0], " at $0 line $caller[2], $filename line ${.}."; exit; } __DATA__ a b c . d e

    Cheers,
    Rob