おそらく簡単な答え: 外部モジュールをインポートせずにこれを変換するにはどうすればよいですか? 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";
}