Я должен сначала сказать, что это не будет точным. Несмотря на то, что ваше оборудование, вероятно, поддерживает разрешение наносекунд, к тому времени, когда оно возвращается к программному обеспечению, оно в сотни раз отключено. Хотя с отметкой времени файла, предположительно используется только по отношению к другим файлам, это может быть менее важно.
Сказав это, единственный способ заявить о наносекундах - это использовать системные инструменты, поэтому stat
my ($ts) = grep { /^\s*Access: [0-9]{4}/ } qx(stat $file);
$ts =~ s/^\s*Access:\s+(.*)/$1/;
или, используя map
в качестве фильтра
my ($ts) = map { /^\s*Access: ([0-9]{4}.*)/ ? $1 : () } qx(stat $file);
Одна проблема здесь, конечно, заключается в том, что мы должны проанализировать вывод; так что смотрите ваши справочные страницы и тестируйте свой stat
, и не надейтесь на большую мобильность. Следите за изменениями в системе, поскольку выходной формат программ может измениться. Но я не нахожу наносекунды в Perl.
Для справки, на моем CentOS 7 (под bash
и tcsh
)
perl -we'$f=shift; print grep { /^\s*Access: [0-9]{4}/ } qx(stat $f)' file
отпечатки для случайного файла
Access: 2019-05-15 13:21:57.723987422 -0700
Еще раз, "нано" секунды не совсем точны.
Другой вариант, возможно, для более надежного анализа выходных данных, - это использовать ls
с его --full-time
my $ts = join ' ', (split ' ', qx(ls --full-time $file))[5..7];
Как всегда, при запуске внешних команд тщательно составьте переменные и соответствующим образом заключите в кавычки / escape Хороший инструмент для цитирования: String :: ShellQuote . Или лучше вообще избегать оболочки, если в ней нет особой необходимости, используя для этого один из множества хороших модулей.