in reply to Does anyone use underscore pseudo-filehandle?

I found this method of referencing in the HTML::Template module as I was reading through the module source this evening. It was used in quite an interesting manner in the _mtime subroutine which checks for the existence of the requested template file and then obtains the system modification timestamp for the file through stat - This modification timestamp is used in HTML::Template in conjunction with its caching functions. The code from HTML::Template is as follows:

sub _mtime { my ($self, $filepath) = @_; my $options = $self->{options}; return(undef) if ($options->{blind_cache}); # make sure it still exists in the filesystem (-r $filepath) or Carp::confess("HTML::Template : template file $f +ilepath does not exist or is unreadable."); # get the modification time return (stat(_))[9]; }

As you can see, the _ construct is passed to stat following the -r (readable) test on the file, presumably given that this stat information is also cached in a similar manner to file test information.

 

Update

Following through on this at perlfunc:_X, it appears that these file tests obtain the information required to return a positive or negative test result via a system stat call. From perlfunc:_X ...

If any of the file tests (or either the stat() or lstat() operators) are given the special filehandle consisting of a solitary underline, then the stat structure of the previous file test (or stat operator) is used, saving a system call. (This doesn't work with -t, and you need to remember that lstat() and -l will leave values in the stat structure for the symbolic link, not the real file.)

print "Can do.\n" if -r $a || -w _ || -x _; stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; print "Executable\n" if -x _; print "Setuid\n" if -u _; print "Setgid\n" if -g _; print "Sticky\n" if -k _; print "Text\n" if -T _; print "Binary\n" if -B _;

 

Ooohhh, Rob no beer function well without!