可能是一个简单的答案:如何在不导入外部模块的情况下进行转换?我已阅读 CPAN,但无法明确指出执行以下操作的方法:
Convert: 20080428 to 28-APR-08
有任何想法吗?
甚至将我引导到教程将不胜感激。
问候, PIAS
此代码在 Y10k 中失败,但这应该足够好了。正则表达式可能更严格,但如果日期已经过验证(或将以新形式验证),那么就没有关系了。
#!/usr/bin/perl
use strict;
use warnings;
my @mon = qw/null JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC/;
my $d = "20080428";
$d =~ s/..(..)(..)(..)/$3-$mon[$2]-$1/;
print "date is now $d\n";
或者,如果你疯了,想在正则表达式中验证(需要 Perl 5.10):
#!/usr/bin/env perl5.10.0
use strict;
use warnings;
my @mon = qw/null JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC/;
my $d = join '', @ARGV;
# only validates between 1600 and 9999
# because of calendar weirdness prior to 1600
$d =~ s/
^
(?:
# non-leap years and everything but 29th of Feb in leap years
(?:
1[6-9] (?<y> [0-9]{2}) |
[2-9][0-9] (?<y> [0-9]{2})
)
(?: #any month 1st through 28th
(?: (?<m> 0[1-9] | 1[0-2]) (?<d> 0[0-9] | 1[0-9] | 2[0-8]) )
| #or 30th of any month but 2
(?: (?<m>0[13-9] | 1[0-2]) (?<d> 30) )
| # or 31st of 1, 3, 5, 7, 8, 10, or 12
(?: (?<m>0[13578] | 1[02]) (?<d> 31) )
)
| # or 29th of Feb in leap years
(?:
(?: #centuries divisible by 4 minus the ones divisible by 100
16 |
[2468][048] |
[3579][26]
)
(?<y> 00)
| #or non-centuries divisible by 4
(?: 1[6-9] | [2-9][0-9] )
(?<y>
0[48] |
[2468][048] |
[13579][26]
)
)
(?<m> 02) (?<d> 29)
)
$
/$+{y}-$mon[$+{m}]-$+{d}/x or die "invalid date: $d";
print "date is now $d\n";
你检查过这些地址 http://www.go4expert.com/forums/showthread.php?t=15533 和这个 perl 文档 http://perldoc.perl.org/functions/localtime.html
my %map = ( '01' => 'JAN', '02' => 'FEB', '03' => 'MAR', '04' => 'APR' ); # You can do the rest yourself ;-)
my $in = '20080428';
if ( $in =~ m/..(..)(..)(..)/ ) {
my ( $y, $m, $d ) = ( $1, $2, $3 );
my $out = sprintf '%02d-%s-%02d', $d, $map{$m}, $y;
}
else {
die "Illegal date format";
}