Какова семантика слова stat для дескриптора dir в Perl?

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
4 014
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы используете его так же, как 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 ...)

Ответ принят как подходящий

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

#!/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, поэтому ее следует избегать, если вы заботитесь о переносимости.

так что он просто stats () сам каталог и не имеет ничего общего с readdir ()?

Alnitak 30.11.2008 20:16

@Alnitak: это правильно, это то же самое, что "stat $ dir", так же как "stat FILEHANDLE" то же самое, что "stat $ file".

Robert Gamble 30.11.2008 20:35

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

$ 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?)

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

работает

  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";

Другие вопросы по теме