Как мне конвертировать дату из ММ / ГГ / ДД в понедельник, год в Perl? - PullRequest
2 голосов
/ 26 апреля 2010

Мне нужно преобразовать дату в строку. Дата вводится как 07/04/2010 и затем должна читаться как July 4th 2010. Его также можно вводить, используя одинарные цифры вместо двойных (7 вместо 07, и нужно добавить 20 к году, если пользователь вводит только /10).

Это то, что я имею до сих пор -

#!/usr/bin/perl
use CGI qw(:standard);
use strict;

#declare variables
my ($date, $month, $day, $year);
my @months = (  "January", "February", "March"
              , "April", "May", "June", "July"
              , "August", "September", "October"
              , "November", "December"
             ); 

#assign input item to variable
$date = param('Date');

#break date apart
$date =~ /([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,2}|20[0-9]{2,2})/;
$month = $1;
$day = $2;
$year = $3;
unless($year =~ /20[0-9]{2,2}/){
    $year = "20".$year;
}
$date = $months[int($1)]." ".$day.", ".$year;

#display date
print "<HTML><HEAD><TITLE>The Date</TITLE></HEAD>\n";
print "<BODY>\n";
print "The date is: $date\n";
print "</BODY></HTML>\n";

Однако я продолжаю получать ошибки

Use of uninitialized value in pattern match (m//) at c08ex6.cgi line 14.
Use of uninitialized value in pattern match (m//) at c08ex6.cgi line 18.
Use of uninitialized value in concatenation (.) or string at c08ex6.cgi line 19.
Use of uninitialized value in int at c08ex6.cgi line 21.
Use of uninitialized value in concatenation (.) or string at c08ex6.cgi line 21.

Ответы [ 4 ]

4 голосов
/ 26 апреля 2010

Не изобретайте велосипед, если вам уже доступны идеально круглые колеса. :-) Используйте такой модуль, как DateTime или Time :: Piece .

Например ...

#!/usr/bin/perl

use strict;
use warnings;

use CGI qw(:standard);
use Time::Piece;

my $date = param('Date');
my $t = Time::Piece->strptime($date, '%m/%d/%Y');
$date = $t->strftime('%B %e, %Y');

#display date
print "<HTML><HEAD><TITLE>The Date</TITLE></HEAD>\n";
print "<BODY>\n";
print "The date is: $date\n";
print "</BODY></HTML>\n";

- Майкл

1 голос
/ 26 апреля 2010

Ваш Perl-код несколько хитроумный (вы не проверяете, соответствует ли ваше совпадение регулярному выражению, прежде чем использовать его результаты), но первое предупреждение, которое вы получите, должно устранить проблему. Вы используете неинициализированное значение в своем регулярном выражении.

Это должно сказать вам, что $date не определено. Это означает, что ваш ввод (либо форма, либо параметр запроса) не имеет параметра с именем Дата . Попробуйте исправить это, а затем исправьте все проблемы в вашем коде, упомянутые другими людьми, отвечающими вам.

1 голос
/ 26 апреля 2010

Это работает, как ожидалось:

#!/usr/bin/perl
use strict;

#declare variables
my ($date, $month, $day, $year);
my @months = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); 

#assign input item to variable
#$date = param('Date');


#break date apart
while(<DATA>) {
   $date=$_;
   $date =~ /^\s*([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,4})\s*$/;
   $month = int($1-1);
   $day = $2;
   $year = $3;
   $year="20$year" if ($year=~/^\d\d$/);
   $date = $months[$month]." ".$day.", ".$year;

   print "date=$date\n";
}

__DATA__
7/4/1999    
   07/4/2010
1/1/2011
12/31/2010
4/4/09

Вывод:

date=July 4, 1999
date=July 4, 2010
date=January 1, 2011
date=December 31, 2010
date=April 4, 2009

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

0 голосов
/ 26 апреля 2010

Вы получаете эти предупреждающие сообщения, потому что значение $date не соответствует вашему регулярному выражению. Попробуйте напечатать значение $date:

use CGI qw(:standard); 
use strict; 
use warnings;

#declare variables 
my ($date, $month, $day, $year); 
my @months = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");  

#assign input item to variable 
$date = param('Date'); 
print "date >>>$date<<<\n";

Рекомендуется также проверить соответствие вашего регулярного выражения перед попыткой использования захваченных значений.

#break date apart 
if ($date =~ /([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,2}|20[0-9]{2,2})/) {
    $month = $1; 
    $day = $2; 
    $year = $3; 
}
else {
    die "Error: unexpected date format: $date";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...