Какова семантика слова «stat» на рукоятке директора в Perl?

Изучая другой вопрос, я заметил, что функция stat в Perl может принимать дескриптор каталога в качестве аргумента (вместо дескриптора файла или имени файла).

Однако я не могу найти примеров правильного использования this - их нет в руководстве по Perl.

Может ли кто-нибудь показать пример того, как его использовать?


person Alnitak    schedule 30.11.2008    source источник


Ответы (4)


Вы используете его так же, как для файла или дескриптора файла:

#!/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";

Возможность использовать stat для дескрипторов каталогов была добавлена ​​примерно в Perl 5.10, поэтому ее следует избегать, если вы заботитесь о переносимости.

person Robert Gamble    schedule 30.11.2008
comment
так что это просто stats() сам каталог, и не имеет ли ничего общего с readdir() ? - person Alnitak; 30.11.2008
comment
@Alnitak: это правильно, это то же самое, что и stat $dir, так же как stat FILEHANDLE совпадает с stat $file. - person Robert Gamble; 30.11.2008

Вы используете его так же, как stat для дескриптора файла:

<~> $ 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

(Лично мне нравится использовать File::stat для получения хороших именованных методов доступа, так что мне не нужно помнить (или искать), что пятый элемент - это UID...)

person genehack    schedule 30.11.2008

Просто имейте в виду, что если дескриптор когда-либо использовался в качестве дескриптора файла, а также дескриптора каталога, статистика будет применяться к файлу, а не к каталогу:

$ 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?)
person ysth    schedule 30.11.2008

Я использую Perl 5.10.1 в Windows (ActivePerl), и выполнение статистики на дескрипторе каталога не работает. Но выполнение статистики по строке пути к каталогу работает.

работает

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

это не ("Функция dirfd не реализована...")

  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";
person Community    schedule 16.11.2009