#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);