Pregunta

Al investigar otra pregunta, noté que la función stat en Perl puede tomar un dirhandle como argumento (en lugar de un filehandle o filename).

Sin embargo, no puedo encontrar ningún ejemplo del uso correcto de esto; no hay ninguno en el manual de Perl.

¿Alguien puede mostrar un ejemplo de cómo usarlo?

¿Fue útil?

Solución

Lo usa de la misma manera que lo hace para un archivo o manejador de archivos:

#!/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 capacidad de utilizar estadísticas en los identificadores de directorio se acaba de agregar alrededor de Perl 5.10, por lo que debe evitarse si le preocupa la portabilidad.

Otros consejos

Lo usa como lo haría con stat en un identificador de archivo:

<~> $ 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, me gusta usar File :: stat para obtener buenos accesores con nombre, para que no tenga que recordar (o buscar) que el quinto elemento es el UID ...)

Solo tenga en cuenta que si alguna vez se utilizó un identificador como un identificador de archivo, así como un identificador de directorio, la estadística se aplicará al archivo, no al directorio:

$ 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 en Windows (ActivePerl) y hacer stat en un directorio no funciona. Pero hacer una estadística en la cadena de ruta del directorio funciona.

funciona

  my $mtime = (stat( $directory ))[ 9 ];
  print "D $directory $mtime\n";

esto no (" La función dirfd no está implementada ... ")

  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";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top