Harry Putnam wrote: > Steve Grazzini <[EMAIL PROTECTED]> writes: > > > Harry Putnam <[EMAIL PROTECTED]> wrote: > > > "Janek Schleicher" <[EMAIL PROTECTED]> writes: > > > > > > > > The underscore _ holds the results of the last stat call > > > > (implicitly called by the -f operator), so no unnecessary > > > > work needs to be done. > > > > > > I've seen that `_' crop up before > > > I don't understand what this means. > > > > It's documented in perlfunc: > > Yes, I saw it there too. I must be having a particularly dense time > of it, but I still am missing what is actually in _
There is nothing 'in' the underscore. What happens is that if you use the -X operators with '_' as the parameter, then instead of calling 'stat' to fetch the file's details the results of the last call to 'stat' are used directly. Where and how these are saved you don't need to know. > > $ perldoc -f stat > > [ snip ] > > > > 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 previous content of the stat structure is what? (in plain english) > Does it mean the previous values of the 13 elements produced by stat? Roughly. But the 13 elements are values that are set up to be handed back neatly to the Perl calling code. The information may be kept in this format or some other, but it doesn't matter to you. > Or something else... > > if (-e $file and -f _) { ... > > What is -f being tested against. If not $file then what... This is a particularly bad example, because -f will return 'true' only if the file actually exists anyway. But what this does is - call stat($file) - use the results to see if the file exists - use the results to see if it's a regular file - 'and' the two together and execute the conditional code accordingly > The > ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, > $atime,$mtime,$ctime,$blksize,$blocks) > Resulting from the -e test? Sort of. But this is the list returned from 'stat' to Perl calling code. For -X operators 'stat' is called implicitly and has to remember only enough information to be able to derive that list, or the result of any subsequent '-X _' call. > Or getting back to original question... > perl -e '$mode = (stat($ARGV[0]))[2];print "$mode\n";' test.f > 33204 > > What is it about 33204 that tells us `type' is a regular file > The first digit being 3? No.The fact that (33204 & S_IFMT) == S_IFREG > perl -e '$mode = (stat($ARGV[0]))[2];print "$mode\n";' test.d > 16893 > "ditto regular directory" > The first digit being 1? No. The fact that (16893 & S_IFMT) == S_IFDIR > That is, might one just look for a static part of $mode to know the > type? Yes. $mode & S_IFMT > perldoc -f stat seems to indicate it might? > > [...] > 0 dev device number of filesystem > 1 ino inode number > 2 mode file mode (type and permissions) > [...] > > And a few tests with this: > #!/usr/local/bin/perl -w > > for(@ARGV){ > chomp; > $mode = (lstat($_))[2]; > if ( $mode =~ /^3/){ > print "$mode $_: Regular file\n"; > }elsif($mode =~ /^1/){ > print "$mode $_: Directory\n"; > }elsif($mode =~ /^41/){ > print "$mode $_: Symlink\n"; > } > } > > Seem to indicate it will work. No. I wrote the code to derive the file type from an 'lstat' call in a previous post and thought you were happy with that. Exactly how the filing system does it is something to trust and forget about. Especially from within Perl, which will happily that the bits are somewhere that aren't for the sake of portability. Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]