Dear Shawn, You can use more than one file test on the same file to create a complex logical condition. Suppose you only want to operate on files that are both readable and writable; you check each attribute and combine them with and:
if (-r $file and -w $file) { ... } Each time you perform a file test, Perl asks the filesystem for all of the information about the file (Perl’s actually doing a stat each time, which we talk about in the next section). Although you already got that information when you tested -r, Perl asks for the same information again so it can test -w. What a waste! This can be a significant performance problem if you’re testing many attributes on many files. The virtual filehandle _ (just the underscore) uses the information from the last file lookup that a file test operator performed. Perl only has to look up the file information once now: if (-r $file and -w _) { ... } You don’t have to use the file tests next to each other to use _. Here we have them in separate if conditions: if (-r $file) { print "The file is readable!\n"; } if (-w _) { print "The file is writable!\n"; } You have to watch out that you know what the last file lookup really was, though. If you do something else between the file tests, such as call a subroutine, the last file you looked up might be different. Starting with Perl 5.10, you could “stack” your file test operators by lining them all up before the filename: use 5.010; if (-r -w -x -o -d $file) { print "My directory is readable, writable, and executable!\n"; } best, Shaji ------------------------------------------------------------------------------- Your talent is God's gift to you. What you do with it is your gift back to God. ------------------------------------------------------------------------------- On Monday, 17 March 2014 2:35 PM, shawn wilson <ag4ve...@gmail.com> wrote: >From Archive::Tar::File - what's '_' and where is it documented? sub _filetype { my $self = shift; my $file = shift; return unless defined $file; return SYMLINK if (-l $file); # Symlink return FILE if (-f _); # Plain file return DIR if (-d _); # Directory return FIFO if (-p _); # Named pipe return SOCKET if (-S _); # Socket return BLOCKDEV if (-b _); # Block special return CHARDEV if (-c _); # Character special ### shouldn't happen, this is when making archives, not reading ### return LONGLINK if ( $file eq LONGLINK_NAME ); return UNKNOWN; # Something else (like what?) } -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/ -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/