in reply to Do I need/want to close __DATA__?

As per Special Literals:

The program should close DATA when it is done reading from it. (Leaving it open leaks filehandles if the module is reloaded for any reason, so it's a safer practice to close it.)

So yes, any module reading from its DATA should close it. BTW, it's not Geography::Countries::LatLong at fault here, it doesn't have any __DATA__ sections, it's its parent, Geography::Countries. A bug/patch could be filed with that module, although it appears unmaintained.

As for the general feature of appending the information to the error/warning messages, personally, I think it's a useful feature. I believe what it's using is the internal "last filehandle read", the same that eof and tell use when called without arguments, and that $. uses; see e.g. Filehandle, last accessed. Although not extra pretty, and maybe I'm missing an easier way to do this, this works:

use warnings; use strict; sub resetfh { eof do { local *HANDLE; *HANDLE } } my @x = <DATA>; resetfh; warn "test"; __DATA__ 1 2 3

Replies are listed 'Best First'.
Re^2: Do I need/want to close __DATA__?
by choroba (Cardinal) on Apr 13, 2020 at 15:08 UTC
    It can be even shorter (but a bit more confusing) when using a name that's exempt from the "use only once" warning:
    sub refresh { eof local *% }
    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

      Nice, I like it! ;-) This idiom (if I may call it that) is short enough that, IMHO, it doesn't even really need a sub and fits comfortably on a line with a comment explaining it:

      {do eof local *%} # reset Perl's internal "last accessed" filehandle
      

      (I had to put the do in there to get rid of a "Useless use of eof in void context"...) I find it funny that there are so many alternatives to *%, like ** and *! :-)

      ... but of course a sub is the more "best practice" solution here.

      Update: See replies.

        Putting do directly before eof is dangerous. When I try it, it warns:
        do "1" failed, '.' is no longer in @INC; did you mean do "./1"? at ./1.pl line 9.

        because I have a file named 1 in the current directory, and eof local *%; returns 1.

        map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]