Как я могу сравнить время создания файла с текущим временем в Perl?

я хочу сравнить текущее время и время создания файла в Perl, но оба они в другом формате. местное время в этом формате:

22116291110813630

и время создания файла

Today, December 29, 2008, 2:38:37 PM

Как сравнить, какой из них больше, и их разницу?


person Community    schedule 29.12.2008    source источник
comment
Может быть интересно: perl.com/doc/manual/html/ pod/perlfunc/stat.html   -  person some    schedule 29.12.2008
comment
Информация о том, как конвертировать даты: perl.com/pub/a /2003/03/13/datetime.html   -  person some    schedule 29.12.2008
comment
Ответ на ваш вопрос: конвертируйте их в тот же формат. Я предлагаю преобразовать сегодня, 29 декабря 2008 г., в метку времени (количество (милли) секунд с начала эпохи). Тогда это простое сравнение двух чисел   -  person some    schedule 29.12.2008
comment
Вы действительно имеете в виду время создания, которое не отслеживается многими файловыми системами, или вы имеете в виду ctime, которое является временем изменения индекса в Unix-подобных операционных системах?   -  person John Siracusa    schedule 29.12.2008


Ответы (4)


Это даже проще, чем использовать stat() и time()/localtime().

my $diff = -M $filename;

Оператор -M возвращает "возраст" файла (в днях с момента запуска программы). Это описано в разделе -X или в perldoc -f -X.

person jimtut    schedule 29.12.2008
comment
Я знаю, что это старая тема, но я все равно отправляю ответ. -M указывает возраст последней модификации, а не создания файла. -C дал бы правильное значение, как запрошено, но я использую только функции -X (perldoc. perl.org/functions/-X.html) в однострочниках, а в остальное время используйте stat. - person Mr. Muskrat; 13.09.2012

Если вы хотите сравнить значения, вы можете использовать число, полученное из localtime в скалярный контекст и время изменения индекса, которые можно получить из stat:

               ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
                  $atime,$mtime,$ctime,$blksize,$blocks)
                      = stat($filename);

куда:

                 0 dev      device number of filesystem
                 1 ino      inode number
                 2 mode     file mode  (type and permissions)
                 3 nlink    number of (hard) links to the file
                 4 uid      numeric user ID of file's owner
                 5 gid      numeric group ID of file's owner
                 6 rdev     the device identifier (special files only)
                 7 size     total size of file, in bytes
                 8 atime    last access time in seconds since the epoch
                 9 mtime    last modify time in seconds since the epoch
                10 ctime    inode change time in seconds since the epoch (*)
                11 blksize  preferred block size for file system I/O
                12 blocks   actual number of blocks allocated

Итак, вам нужно поле 9:


$mtime = ( stat $filename )[9];
$current_time = time;

$diff = $current_time - $mtime;

person Community    schedule 29.12.2008
comment
Спасибо, что предоставили мне информацию. Я думаю, что это дает разницу в секундах. В любом случае, спасибо за ваше руководство. Заранее с Новым годом - person ; 30.12.2008

localtime возвращает список значений в контексте списка. См. документацию по местному времени или perlcheat. В вашем примере все это выглядит как смешанное. В скалярном контексте он возвращает отформатированную строку, например Mon Dec 29 03:16:33 2008. На большинстве платформ время изменения индекса файла будет возвращено из stat как количество секунд, прошедших с некоторой эпохи. Вы должны иметь возможность напрямую сравнить это с результатом time() (не localtime()).

person Community    schedule 29.12.2008

Эти две функции благодаря ответу jimtut. fileage печатает количество секунд в виде целого числа, идеально подходящего для использования в оболочке, файла с момента его создания. fileage - это ответ на вопрос выше, в то время как dataage печатает то же самое для содержимого файла, что и ответ, который я искал, я уверен, что они оба будут полезны.

function fileage {
  perl -e 'printf "%i\n", 60 * 60 * 24 * -C "'"${1:?Must provide a file name}"'"'
}

function dataage {
  perl -e 'printf "%i\n", 60 * 60 * 24 * -M "'"${1:?Must provide a file name}"'"'
}
person Community    schedule 25.02.2013