Perl, использующий модуль Date :: Parse, не может печатать <STDIN>дату в другом формате - PullRequest
0 голосов
/ 02 января 2019

Я хочу принять пользовательскую дату в командной строке в формате

дд / мм / год

затем распечатайте дату для пользователя в

гггг / мм / дд

Я пытаюсь использовать модуль Date :: Parse для разбора даты, которую нужно перепечатать.

Дата : документы Parse показывают, что я должен иметь возможность получать $ day, $ month и $ year из пользовательского ввода.

use Date::Parse;

$time = str2time($date);

($ss,$mm,$hh,$day,$month,$year,$zone) = strptime($date);

Это мой текущий код:

use strict;
use Date::Parse;

print "Enter a date in dd/mm/yyy format: ";
my $user_date = <STDIN>;
my @date      = strptime($user_date);

# ( $day, $month, $year ) = strptime($user_date);
# my $user_day = ( ($day) = strptime($user_date) );
print "%Y/%m/%d", @date;

Однако при печати происходит сбой, и из вывода, который вводится 10 из 10, выводится 9.

выход

Enter a date in dd/mm/yyy format: 16/10/1952
%Y/%m/%d1952916s

Что мне делать?

1 Ответ

0 голосов
/ 02 января 2019

Документация для 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...