Quais são a semântica de 'status' em um dirhandle em Perl?
Pergunta
Em pesquisando outra pergunta que eu observou que a função stat
em Perl pode tomar um dirhandle como seu argumento (em vez de um filehandle ou nome de arquivo).
No entanto não consigo encontrar qualquer exemplos de uso correto deste -. Não há nenhum no manual Perl
Alguém pode mostrar um exemplo de como usá-lo?
Solução
Você usá-lo da mesma forma que você faz para um arquivo ou 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";
A capacidade de utilização de estatísticas em alças de diretório acabou de ser adicionado ao redor Perl 5.10 por isso deve ser evitado se você se preocupa com a portabilidade.
Outras dicas
Você usá-lo apenas como você stat
em um 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
(Pessoalmente, eu gosto de usar File::stat
conseguir boas nomeados assessores, para que eu não tenho a lembrar (ou lookup) que o quinto elemento é o UID ...)
Esteja ciente de que um se um identificador já foi usado como um filehandle, bem como um dirhandle, o status será aplicado ao arquivo, não o diretório:
$ 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?)
Eu uso Perl 5.10.1 no Windows (ActivePerl) e fazer estatísticas sobre um dirhandle não funciona. Mas fazer uma estatística sobre a cadeia de caminho das obras de diretório.
funciona
my $mtime = (stat( $directory ))[ 9 ];
print "D $directory $mtime\n";
isso não ( "A função dirfd está por implementar ...")
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";