Where's this documented?
>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/
Re: Where's this documented?
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 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/
Re: Where's this documented?
On Mon, Mar 17, 2014 at 10:05 AM, shawn wilson 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?) > > } > Try 'perldoc -f -X' or http://perldoc.perl.org/functions/-X.html In particular, the section that starts (in 5.18 at least) with 'If any of the file tests'
Re: Where's this documented?
Thank y'all. That's weird to read, but it makes sense easy enough. On Mon, Mar 17, 2014 at 7:10 AM, Brian Fraser wrote: > On Mon, Mar 17, 2014 at 10:05 AM, shawn wilson 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?) >> >> } > > > Try 'perldoc -f -X' or http://perldoc.perl.org/functions/-X.html > > In particular, the section that starts (in 5.18 at least) with 'If any of > the file tests' > -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/
Re: Where's this documented?
Shaji Kalidasan wrote: 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 or use stat() or lstat() , 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 or stat() or lstat() performed. Perl only has to look up the file information once now: John -- Any intelligent fool can make things bigger and more complex... It takes a touch of genius - and a lot of courage to move in the opposite direction. -- Albert Einstein -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/
Re: Where's this documented?
On Tue, Mar 18, 2014 at 11:32 PM, John W. Krahn wrote: > Shaji Kalidasan wrote: > > or stat() or lstat() I don't remember seeing that reusing i?stat would not duplicate the stat call...? -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/
Re: Where's this documented?
shawn wilson wrote: Oh, I guess I was thinking that using the file name repeats the stat (which it does). Since I was complaining about the ugliness of '_'. However, you're right - that works as well as (-f _)<-- that doesn't look weird as shit? I've got issues moving my fingers into typing that Whatever, y'all answered my question and I learned something (though damn them for not just making another perlvar or something else to do this) - I appreciate the help/info. _ is a perlvar. It is part of the typeglob that includes $_, @_, %_ and &_. perldoc perldata perldoc perlmod perldoc perlref John -- Any intelligent fool can make things bigger and more complex... It takes a touch of genius - and a lot of courage to move in the opposite direction. -- Albert Einstein -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/
Re[2]: Where's this documented?
From perldoc -f stat: If "stat" is passed the special filehandle consisting of an underline, no stat is done, but the current contents of the stat structure from the last "stat", "lstat", or filetest are returned. Example: if (-x $file && (($d) = stat(_)) && $d < 0) { print "$file is executable NFS file\n"; } (This works on machines only for which the device number is negative under NFS.) We are looking for openstack and python developers. Please check: http://www.nsbeta.info/jobs Wed, 19 Mar 2014 01:44:15 -0400 from shawn wilson : >On Tue, Mar 18, 2014 at 11:32 PM, John W. Krahn < jwkr...@shaw.ca > wrote: >> Shaji Kalidasan wrote: > >> >> or stat() or lstat() > >I don't remember seeing that reusing i?stat would not duplicate the >stat call...? > >-- >To unsubscribe, e-mail: beginners-unsubscr...@perl.org >For additional commands, e-mail: beginners-h...@perl.org >http://learn.perl.org/ > >
Re: Re[2]: Where's this documented?
On Wed, Mar 19, 2014 at 4:21 AM, Yonghua Peng wrote: > From perldoc -f stat: > > If "stat" is passed the special filehandle consisting of an underline, no > stat is done, but the current > contents of the stat structure from the last "stat", "lstat", or filetest > are returned. Example: > > if (-x $file && (($d) = stat(_)) && $d < 0) { > print "$file is executable NFS file\n"; > } > > (This works on machines only for which the device number is negative under > NFS.) > > > > > We are looking for openstack and python developers. > Please check: http://www.nsbeta.info/jobs > > Wed, 19 Mar 2014 01:44:15 -0400 from shawn wilson : > > On Tue, Mar 18, 2014 at 11:32 PM, John W. Krahn wrote: >> Shaji Kalidasan wrote: > >> >> or stat() or lstat() > > I don't remember seeing that reusing i?stat would not duplicate the > stat call...? > Oh, I guess I was thinking that using the file name repeats the stat (which it does). Since I was complaining about the ugliness of '_'. However, you're right - that works as well as (-f _) <-- that doesn't look weird as shit? I've got issues moving my fingers into typing that Whatever, y'all answered my question and I learned something (though damn them for not just making another perlvar or something else to do this) - I appreciate the help/info. -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/
Re: Re[2]: Where's this documented?
On Wed, Mar 19, 2014 at 10:37 AM, shawn wilson wrote: > On Wed, Mar 19, 2014 at 4:21 AM, Yonghua Peng wrote: > > From perldoc -f stat: > > > > If "stat" is passed the special filehandle consisting of an underline, no > > stat is done, but the current > > contents of the stat structure from the last "stat", "lstat", or filetest > > are returned. Example: > > > > if (-x $file && (($d) = stat(_)) && $d < 0) { > > print "$file is executable NFS file\n"; > > } > > > > (This works on machines only for which the device number is negative > under > > NFS.) > > > > > > > > > > We are looking for openstack and python developers. > > Please check: http://www.nsbeta.info/jobs > > > > Wed, 19 Mar 2014 01:44:15 -0400 from shawn wilson : > > > > On Tue, Mar 18, 2014 at 11:32 PM, John W. Krahn wrote: > >> Shaji Kalidasan wrote: > > > >> > >> or stat() or lstat() > > > > I don't remember seeing that reusing i?stat would not duplicate the > > stat call...? > > > > Oh, I guess I was thinking that using the file name repeats the stat > (which it does). Since I was complaining about the ugliness of '_'. > However, you're right - that works as well as (-f _) <-- that doesn't > look weird as shit? I've got issues moving my fingers into typing > that Whatever, y'all answered my question and I learned something > (though damn them for not just making another perlvar or something > else to do this) If you don't like it, then put your time where your mouth is: Perl is open source, patches are always welcome.