Как я могу получить изменение локального времени файла с помощью File::stat в perl?

#perl #datetime

#perl #datetime

Вопрос:

Как я могу получить время изменения файла, отформатированное по местному времени?

Выполнив это:

 use File::stat;
use Time::Piece;

my $format = '%Y%m%d%H%M';

print Time::Piece->strptime(stat($ARGV[0])->mtime, '%s')->strftime($format);
 

Я получаю 202011301257 для файла, который был сохранен 30 ноября в 13:57 по моему местному времени (GMT 01:00).

Поскольку я могу сделать

 print localtime $file->stat->mtime;
 

и

 print localtime->strftime($format)
 

Я хотел бы сделать что-то вроде

 print (localtime stat($file)->mtime)->strftime($format);
 

Который выдает

 Can't locate object method "mtime" via package "1" (perhaps you forgot to load "1"?) 
 

Любой совет?

Ответ №1:

Я хотел бы сделать что-то вроде

 print (localtime stat($file)->mtime)->strftime($format);
 

Очень близко! Ваша первая скобка не в том месте:

 #!/usr/bin/env perl
use warnings; # Pardon the boilerplate
use strict;
use feature 'say';
use File::stat;
use Time::Piece;

my $format = '%Y%m%d%H%M';
say localtime(stat($ARGV[0])->mtime)->strftime($format);
 

Комментарии:

1. Повторите » Ваша первая скобка находится не в том месте «, на самом деле это не проблема. Размещение круглых скобок правильное. Проблема в том, что здесь требуются пропущенные скобки вокруг print, потому print (...)->strftime($format); что означает ( print(...) )->strftime($format);

Ответ №2:

Всегда используйте use strict; use warnings; . Это выявило бы проблему:

 print (...) interpreted as function at a.pl line 6.
 

У вас есть следующее

 print ( localtime ... )->strftime($format);
 

Поскольку пробел между print и ( не имеет смысла, приведенное выше эквивалентно следующему:

 ( print( localtime ... ) )->strftime($format);
 

Проблема в том, что вы используете ->strftime результат print . Проблема исчезнет, если вы не опустите скобки вокруг print операндов.

 print( ( localtime ... )->strftime($format) );
 

В качестве альтернативы, не пропуская аргументы в скобках localtime , вы могли бы удалить скобки, вызывающие проблему.

 print localtime( ... )->strftime($format);