Quali sono le semantiche di "stat" su un dirhandle in Perl?
Domanda
Durante la ricerca di un'altra domanda ho notato che la funzione stat
in Perl può assumere un dirhandle come argomento (anziché un filehandle o un nome file).
Comunque non riesco a trovare alcun esempio di uso corretto di questo - non ce ne sono nel manuale Perl.
Qualcuno può mostrare un esempio di come usarlo?
Soluzione
Lo usi come fai per un file o un filehandle:
#!/usr/bin/perl
use strict;
my $dir = shift;
opendir(DIR, $dir) or die "Failed to open $dir: $!\n";
my @stats = stat DIR;
closedir(DIR);
my $atime = scalar localtime $stats[8];
print "Last access time on $dir: $atime\n";
La possibilità di usare stat sugli handle di directory è stata appena aggiunta a Perl 5.10, quindi dovrebbe essere evitata se ti interessa la portabilità.
Altri suggerimenti
Lo usi proprio come faresti con stat
su un filehandle:
<~> $ mkdir -v foo ; perl -e 'opendir($dh , "./foo"); @s = stat $dh; print "@s"'
mkdir: created directory `foo'
2049 11681802 16877 2 1001 1001 0 4096 1228059876 1228059876 1228059876 4096 8
(Personalmente, mi piace usare File :: stat
per ottenere degli accessor con un bel nome, quindi non devo ricordare (o cercare) che il quinto elemento è l'UID ...)
Basta essere consapevoli del fatto che se un handle è mai stato usato come filehandle, oltre che come dirhandle, la stat verrà applicata al file, non alla directory:
$ perl -wl
opendir $h, "." or die;
open $h, "/etc/services" or die;
print "dir:".readdir($h);
print "file:".readline($h);
print stat("/etc/services");
print stat(".");
print stat($h);
close($h);
print stat($h);
__END__
dir:.
file:# Network services, Internet style
205527886633188100018274122800783211967194861209994037409640
20551515522168777410001000020480122803711512280371021228037102409640
205527886633188100018274122800783211967194861209994037409640
stat() on closed filehandle $h at - line 1.
(Are you trying to call stat() on dirhandle $h?)
Uso Perl 5.10.1 su Windows (ActivePerl) e fare stat su un dirhandle non funziona. Ma fare una stat sulla stringa del percorso della directory funziona.
lavori
my $mtime = (stat( $directory ))[ 9 ];
print "D $directory $mtime\n";
no (" La funzione dirfd non è implementata ... ")
my $dh;
if( opendir( $dh, $directory ) == 0 ) {
print "ERROR: can't open directory '$directory': $!\n";
return;
}
$mtime = (stat( $dh ))[ 9 ];
print "D $directory $mtime\n";