Документация для Date :: Parse не ясна, но похоже, что вы получаете значения обратно в формате, который ожидал бы localtime()
. Например, год выглядит как год минус 1900. Это означает, что номер месяца будет от 0 до 11, а не от 1 до 12.
Date :: Parse не обновлялся более пяти лет. Я бы посоветовал избегать этого в наши дни. Есть гораздо лучшие варианты на выбор. К ним относятся Time :: Piece , который входит в стандартную часть дистрибутива Perl начиная с версии 5.10.0. Вы можете использовать его strptime()
(время разбора строки) для разбора вашей строки и его strftime()
(время форматирования строки) для форматирования объекта даты, как вам нравится.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Time::Piece;
print "Enter a date in dd/mm/yyy format: ";
chomp(my $user_date = <STDIN>);
my $tp = Time::Piece->strptime($user_date, '%d/%m/%Y');
say $tp->strftime('%Y/%m/%d');
Обновление:
Кроме того, на самом деле не ясно, что должна делать эта строка:
print "%Y/%m/%d", @date;
Я думаю, вы подумали об использовании метода strftime()
из POSIX.pm.
print strftime "%Y/%m/%d", @date;
Но с use warnings
это генерирует предупреждения из-за всех неопределенных значений в @data
(это довольно странное проектное решение в этом модуле и, на мой взгляд, еще одна причина избегать его). Вы можете исправить это, заменив:
my @date = strptime($user_date);
С:
my @date = map { $_ // 0 } strptime($user_date);