我需要将日期转换为字符串。日期输入为07/04/2010
,然后应显示July 4th 2010
。它也应该能够使用单个数字而不是双数字输入(7而不是07,如果用户仅输入/ 10,则需要将20添加到年份。)
这是我到目前为止 -
#!/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.
答案 0 :(得分:4)
如果您已经可以使用完美的圆形轮子,请不要重新发明轮子。 :-) 使用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 :(得分:1)
这可以按预期工作:
#!/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
我猜这个问题是从表单中获取数据。
答案 2 :(得分:1)
你的Perl代码有点狡猾(在使用结果之前你没有检查你的正则表达式匹配是否成功)但是你得到的第一个警告应该解决问题。您在正则表达式中使用未初始化的值。
那应该告诉你$date
未定义。这意味着您的输入(表单或查询参数)中没有名为日期的参数。尝试修复它,然后解决其他人回答你提到的代码中的所有问题。
答案 3 :(得分:0)
您收到这些警告消息,因为$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";
}